在popen工作时缓冲

时间:2016-07-04 10:10:01

标签: c popen

我使用以下命令获得两位数值的常量输出:

pipe = popen("hcidump -a | egrep --line-buffered 'RSSI|bdaddr' | grep -A1 --line-buffered --no-group-separator 'bdaddr 78:A5:04:17:9F:66' | grep -Po --line-buffered 'RSSI:\\s+\\K.*'", "r");

我想缓冲它,所以我可以将它转换为整数值并使用它。但我不确定如何实现这一目标。只要我有popen运行我的C程序将不会继续。我用strace检查了一下,他将读取popen中的值,并且不会这样做。

其余代码如下:

if (pipe) 
    {
        printf("entered pipe-if");

        while(!feof(pipe)) 
        {
            if(fgets(buffer, 128, pipe) != NULL){}
        }   
        pclose(pipe);
        printf("pclose");
        buffer[strlen(buffer)-1] = '\0';
    } 

背后的想法是我想使用数据计算实时"实时"。一种可能性是我可以告诉popen在x秒后结束进程,然后使用缓冲数据然后从头开始进程。

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:3)

使用popen打开管道后,您应该使用文件描述符而不是FILE指针。然后,您可以将文件转为非阻塞,并在数据进入时处理。

int fd = fileno(pipe);
fcntl(fd, F_SETFL, O_NONBLOCK);

然后您可以使用

从管道中读取数据
bytes = read(fd, buf, bufsize);

如果bytes大于0,那么您还需要处理更多数据。如果bytes是-1而errno是EAGAIN,那么管道中没有任何内容。你做过的其他事情。你必须处理数据然而它会进来(即你没有得到fgets()很好地按行进行)