首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程挂起,管道被阻塞

进程挂起,管道被阻塞
EN

Stack Overflow用户
提问于 2013-05-11 05:00:09
回答 2查看 424关注 0票数 1

我好像遇到了一个僵局。我让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

我怀疑这就是挂起的原因。我们有没有什么命令可以告诉我哪个进程在读/写这个管道?或者任何进一步的信息都将不胜感激。提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-05-11 05:26:28

我能想到两种可能的可能性:

  1. 由于输出缓冲而出现死锁。尝试在所有输出管道上启用自动刷新。如果两个进程使用管道进行双向通信,则很可能发生这种情况:它们各自写入一些内容并等待读取响应,但是因为输出是缓冲的,所以响应永远不会发送到管道。
  2. 一个进程正在等待管道上的EOF,但它从未出现。如果管道是在父进程中创建的,然后由子进程继承,则需要确保所有进程都关闭管道的写入端,以便读取器将读取EOF。
票数 0
EN

Stack Overflow用户

发布于 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命令,它很好地显示了每个进程是如何读取和写入数据的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16490758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档