我使用以下命令获得两位数值的常量输出:
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秒后结束进程,然后使用缓冲数据然后从头开始进程。
感谢您的帮助和建议。
答案 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()很好地按行进行)