在 popen 工作时缓冲

Buffering while popen working

我正在使用以下命令来获取两位数值的恒定输出:

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里面的值,不会termit。

其余代码如下所示:

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

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

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

感谢您的帮助和建议。

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

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

然后你可以使用

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

如果 bytes 大于 0,那么您还有一些数据要处理。如果 bytes 为 -1 且 errno 为 EAGAIN,则管道中没有任何内容。其他任何事情你都完成了。您将不得不处理传入的数据(即您无法让 fgets() 很好地按行执行操作)