在 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() 很好地按行执行操作)
我正在使用以下命令来获取两位数值的恒定输出:
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() 很好地按行执行操作)