【发布时间】:2012-06-09 15:05:07
【问题描述】:
关于非阻塞管道的问题有很多,但没有可以复制和粘贴(几乎没有更正)和使用的代码示例。
我从这个帖子中得到了想法和来源: Non-blocking pipe using popen?
但是如何使用它呢?在while 循环?请检查我的更改。真的需要使用 errno == EAGAIN 和附加标题 #include <cerrno> 吗?
如果需要,建议您拥有更好的版本:
FILE *pipe;
char buff[512];
if ( !(pipe = popen( command.c_str(), "r")) ) return false;
int d = fileno(pipe);
while ( true )
{
ssize_t r = read(d, buff, sizeof(buff));
if (r == -1 && errno == EAGAIN) // really need errno?
continue;
else if (r > 0)
ptr_output->append(buff);
else
break;
}
pclose(pipe);
【问题讨论】:
-
管道不是非阻塞的,你没有复制'n'粘贴正确的代码。
-
@JonathanWakely !!!你太棒了!只有你发现它的阻塞!我没有 24 小时睡觉,并试图解决问题并失去一针,并且认为它没有帮助。也许现在我的线程不会慢下来。谢谢。
-
你不应该这样编辑问题来支持a follow on questions。这让这个问题看起来很荒谬。改为重现新问题中的代码。