我正在运行该程序: Darwin内核版本12。3。0日:太阳1月6日22:37:10太平洋标准时间2013; root:xnu-2050.22.13~1 / RELEASE_X86_64 x86_64
“lsof”有4个条目引用相同的PIPE:
perl5.12 1414 root 1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727
perl5.12 1768 root 1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727
perl5.12 1759 root 1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727
perl5.12 1760 root 1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727
我怀疑是造成这种情况的原因。 我们有任何命令可以告诉我读取/写入此PIPE的过程是什么? 或者任何进一步的信息将不胜感激。 提前谢谢!
答案 0 :(得分:0)
我可以想到两种可能的可能性:
由于输出缓冲导致死锁。尝试在所有输出管道上启用autoflush。如果两个进程使用管道进行双向通信,则很可能:它们每个都写入一些内容并等待读取响应,但由于输出是缓冲的,因此响应永远不会发送到管道。
进程正在等待管道上的EOF,但它永远不会到来。如果管道是在父进程中创建的,然后由子进程继承,则需要确保所有进程都关闭管道的写入端,以便读取器读取EOF。
答案 1 :(得分:0)
Barmar还解释说,当输出缓冲区填满时,子进程可能会卡住。在这种情况下,您会发现Child Process卡在write()
函数调用中。
您必须在父进程中使用Perl IO::Select
模块继续从子进程读取输出缓冲区,如果子进程的输出大于缓冲区,则将其清空。
官方Perl文档 http://perldoc.perl.org/functions/sysread.html 说明:
sysread FILEHANDLE,SCALAR,LENGTH
尝试读取LENGTH个字节的数据 从指定的FILEHANDLE到变量SCALAR,使用read(2)。它 绕过缓冲IO,将其与其他类型的读取混合,打印, 写作,寻求,告知或eof可能会导致混淆,因为perlio或 stdio层通常缓冲数据。
进一步查看系统活动我通常使用strace
命令,它可以很好地显示每个进程如何读写数据。