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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值