我好像遇到了一个僵局。我让perl脚本派生并调用另一个perl脚本。然后这个过程就会挂在某个地方。
我正在运行这个程序: Darwin Kernel version12.3.0: Sun Jan 6 22:37:10 PST 2013;根目录:xnu-2050.22.13~1/RELEASE_ x86_64 x86_64
"lsof“有4个条目指向同一个管道:
perl5.12 1414根1管道0x48937dc1254fe937 16384 ->0x48937dc1254fe727
perl5.12 1768根1管道0x48937dc1254fe937 16384 ->0x48937dc1254fe727
perl5.12 1759根1管道0x48937dc1254fe937 16384 ->0x48937dc1254fe727
perl5.12 1760根1管道0x48937dc1254fe937 16384 ->0x48937dc1254fe727
我怀疑这就是挂起的原因。我们有没有什么命令可以告诉我哪个进程在读/写这个管道?或者任何进一步的信息都将不胜感激。提前感谢!
发布于 2013-05-11 05:26:28
我能想到两种可能的可能性:
发布于 2018-06-01 17:57:43
正如Barmar还解释的,当输出缓冲区填满时,子进程可能会被卡住。在这种情况下,您会发现子进程卡在write()函数调用中。
您将不得不在父进程中使用Perl IO::Select模块来继续从子进程读取输出缓冲区,从而如果子进程的输出大于缓冲区,则将其清空。
http://perldoc.perl.org/functions/sysread.html的官方Perl文档解释了:
sysread文件,标量,长度
尝试使用read(2)从指定的FILEHANDLE中将数据的长度字节读取到变量标量中。它绕过了缓冲的IO,因此将其与其他类型的读取、打印、写入、查找、告知或eof混合可能会导致混淆,因为perlio或stdio层通常会缓冲数据。
此外,为了查看系统活动,我通常使用strace命令,它很好地显示了每个进程是如何读取和写入数据的。
https://stackoverflow.com/questions/16490758
复制相似问题