0

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

他的整个事情是相当危险的,因为你可能会永远阻止。它假设它会与 bc .... 之类的东西对话......来自 CPAN 的 IO::Pty 和 Expect 模块可以帮助解决这个问题,因为它们提供了一个真正的 tty(实际上是一个伪 tty),它让您再次回到调用命令中的行缓冲。

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

顺便问一下,从 open2 返回的 FileHandler 是否可以无阻塞读取?

很感谢 !

4

1 回答 1

0

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

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

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

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

于 2012-10-03T16:57:12.027 回答