c++ 如何用C语言存储hcitool扫描结果,并在终端上打印

kqqjbcuj  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(119)

我尝试在ubuntu Linux 18.04的终端上捕获hcitool lescan命令的结果。
这是我的代码

x_pipe = popen("/usr/bin/hcitool lescan", "w");
if (!x_pipe) 
{
  perror("x popen failed!");
  pclose(x_pipe);
  return -1;
}
sleep(3);
while(fgets(buffer, sizeof(buffer), x_pipe) != NULL)
{
  printf("Debug: %s", buffer);
}

这是我的测试结果

root@device100:~# bt_service
LE Scan ...
76:AC:17:0C:B8:CF (unknown)
23:61:7A:13:08:E2 (unknown)
27:17:7F:D4:2E:13 (unknown)
20:20:CE:D8:42:22 (unknown)
5C:AD:01:C6:EB:7D (unknown)

我知道我发送命令到蓝牙设备,它已经开始扫描。但是,这个结果从终端是出乎意料的,我想。
我以为...(期待)

root@device100:~# bt_service
LE Scan ...
Debug: 76:AC:17:0C:B8:CF (unknown)
Debug: 23:61:7A:13:08:E2 (unknown)
Debug: 27:17:7F:D4:2E:13 (unknown)
Debug: 20:20:CE:D8:42:22 (unknown)
Debug: 5C:AD:01:C6:EB:7D (unknown)
anhgbhbe

anhgbhbe1#

但是,我可以在终端看到数据。
因为(引用popen manual
popen()的返回值在所有方面都是一个普通的标准I/O流,保存它必须用pclose()而不是fclose(3)关闭。写入这样的流会写入命令的标准输入;该命令的标准输出与调用popen()的进程的输出相同,除非命令本身改变了这一点。相反,从流中阅读会读取命令的标准输出,而命令的标准输入与调用popen()的进程的标准输入相同。
你打开了你的管道进行写入,所以你的管道的stdout会转到你的进程(你的控制台)的stdout。
打开阅读就行了

FILE *x_pipe = popen("/usr/bin/hcitool lescan", "r");

您还可以选择将命令stderr重定向到stdout,以捕获所有可能的输出:

FILE *x_pipe = popen("/usr/bin/hcitool lescan 2>&1", "r");

相关问题