为什么IO :: Pty和Expect模块可以帮助解决open2的阻塞问题?

时间:2012-10-03 09:23:11

标签: perl ipc

perl的open2 perldoc:http://perldoc.perl.org/IPC/Open2.html 描述:

  他的整个事情都非常危险,因为你可能永远阻止。它假设它会像bc那样谈论....   ...   来自CPAN的IO :: Pty和Expect模块可以提供帮助,因为它们提供了一个真正的tty(实际上是伪tty),它可以让你再次回到被调用命令中的行缓冲。

但我不明白为什么IO :: Pty和Except模块可以解决open2的问题?

顺便说一句,从open2返回的FileHandler可以被noblocking readed吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

使用缓冲I / O时,在缓冲区已满之前,不会通过文件句柄发送数据。这与终端I / O不同,终端I / O在用户按Enter键时发送一行。因此,如果您正在编写与程序交互的程序,就好像它是用户一样,缓冲的I / O可能会导致问题。例如,您的程序可以发送一行数据,期望对方收到它并输出回复。但是,如果等待回复时该行数据仍然位于输出缓冲区中,您将死锁 - 您的程序正在等待正在等待输入的程序的回复,该程序仍然位于输出缓冲区中。 / p>

使用pty与程序交互允许您使用行缓冲(在两个方向上),以便在流中遇到换行符时发送数据。

此外,可以以非阻塞方式读取任何文件句柄 - 只需使用select来确定该文件句柄上是否有可用数据。

本文可能有助于解释:http://www.pixelbeat.org/programming/stdio_buffering/