linux popen非阻塞函数,c – 正确代码 – 带有popen的无阻塞管道

  • Post author:
  • Post category:linux


有很多关于非阻塞管道的问题,但没有代码可以复制和粘贴(几乎没有修正)和使用的例子.

但是怎么用呢?在周期?请检查我的更改.是否真的需要使用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