有很多关于非阻塞管道的问题,但没有代码可以复制和粘贴(几乎没有修正)和使用的例子.
但是怎么用呢?在周期?请检查我的更改.是否真的需要使用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);
解决方法:
是.如果读取调用返回错误值(-1)并且errno设置为EAGAIN,则表示没有可用数据,因此您继续循环以再次尝试.如果你摆脱了errno,错误将被有效忽略,你的程序可能会崩溃.想象一下,如果你确实删除它:当读取返回-1时,但是,例如,错误是管道被破坏(另一端关闭它),你将继续尝试循环并进入无限循环.馊主意.
标签:c,pipe,popen
来源: https://codeday.me/bug/20190927/1824876.html