2016-07-04 40 views
0

我使用下面的命令来获得两位数的值的恒定输出:缓冲而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"); 

我希望缓冲,这样我就可以将其转化为一个整数值,并与合作它。但我不确定如何实现这一点。只要我正在运行,我的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'; 
    } 

其背后的想法是,我要使用的数据在“实时”来计算distnace。一种可能性是我可以告诉popen在x秒后结束这个过程,然后使用缓冲的数据,然后从头开始这个过程。

感谢您的帮助和建议。

+0

你为什么认为会有一个EOF? –

+0

我知道没有EOF,我正在尝试一些东西,并保持。我的错误把它放在这里。 – DaPole

回答

3

使用popen打开管道后,应该使用文件描述符而不是FILE指针。然后,您可以打开文件,无阻塞和处理数据,因为它的用武之地。

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

然后你就可以使用

bytes = read(fd, buf, bufsize); 

如果字节大于0读取从管道的数据,然后你有更多的数据要处理。如果字节是-1,errno是EAGAIN,那么管道中没有任何东西。你做的任何事情。你将不得不处理数据,但它会进来(即你没有得到fgets()很好地做事每行)

+0

但是,这不会让我面临同样的问题吗?当我第一次使用popen和一个永无止境的输出时,我永远不会到达fileno,fcntl和read的地步? – DaPole

+0

通过使文件描述符无阻塞,即使没有输出,也可以在程序中控制回来,所以如果需要,可以实现自己的超时。尽管我不能说我完全理解了用例,但在我看来,当你看到新数据时(例如,在每次返回fgets()或read()时,打开管道和处理数据会更好版本),而不是关闭管道后。 – mykel

+0

用例是我想从iBeacon读取RSSI值,以了解它是否离我的设备近,中或远。取决于我需要给出进一步指示的价值。这就是为什么我需要不断阅读价值观并对它们做出反应。它不需要是实时的,但经常。意味着我可以收集一些数据(如一两秒钟),然后进一步处理。我会在稍后尝试你的方法。 – DaPole