【发布时间】:2015-12-11 10:04:07
【问题描述】:
我想知道如果标准输出缓冲区溢出会发生什么?
例如:app 1 启动app 2,将N 行写入其stdin 并且THEN 读取其stdout。第二个应用程序只是将它从stdin 获得的所有内容重写为stdout。目前app 1 完成将N 行写入app 2 并切换到读取其stdout,app 2 已经完成将行打印到stdout。这个数据在其标准输出的缓冲区中。随着N的增加,我们可以溢出缓冲区。
然后会发生什么? app 2 会崩溃还是它的进程阻塞?如果是崩溃,错误代码是什么(linux)?
编辑:一些代码http://pastebin.com/msMRdxGR
我收到 SIGPIPE 错误。 (并且使用了错误的标签 - app1 是 app2,反之亦然)。
很抱歉没有从一开始就问,但是有没有办法避免这个错误?如果 app2 使用 2 个线程 - 一个用于读取,另一个用于写入。并在堆中内部动态分配缓冲区以在它们之间交换数据。然后,如果没有人读取我的标准输出,我可以暂停读取线程的写入线程。但是如何检测到 stdout buf 很快就会溢出呢?
【问题讨论】:
-
什么,写信给
stdin,读给stdout?这将如何运作? -
你到底在说什么缓冲区?你的意思是 C++ 标准输出/流缓冲区吗?还是您的意思是实际的操作系统设备缓冲区?
-
假设您正在谈论使用双向管道(或在每个方向工作的一对管道)将数据传入和传出同一应用程序,您必须确保您不会死锁 -当应用程序无法写入更多内容时,如果“管道的另一端”没有读取,应用程序将在操作系统中阻塞,因此如果您不小心,可能会出现两个应用程序都在等待的情况。
-
@JoachimPileborg 我的意思是写入第二个应用程序的标准输入并读取第二个应用程序标准输出。我为此使用 Qt 和 QProcess。
-
@truf 您应该将此添加到您的问题中。请参阅this question,其中包含有关 SIGPIPE 的信息。基本上,取决于两个进程之间的 PIPE 是如何创建的,写入一个完整的缓冲区可能会失败,而不是简单地阻塞 (
O_NON_BLOCK)。