如何用C语言存储并在终端打印hcitool lescan扫描结果
解决hcitool lescan输出捕获与格式化问题
问题根源
你的代码存在三个关键问题:
popen用错了模式:"w"是用来给子进程发数据的,要读取hcitool lescan的输出得用"r"模式。hcitool lescan的部分输出会直接走stderr,默认管道抓不到这部分内容,得重定向到stdout。- 错误处理有问题:
popen失败后调用pclose(x_pipe)会操作空指针,触发异常。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define BUFFER_LEN 256 int main() { FILE *scan_pipe; char buffer[BUFFER_LEN]; // 用r模式读取输出,同时把stderr重定向到stdout,确保所有内容能被捕获 scan_pipe = popen("/usr/bin/hcitool lescan 2>&1", "r"); if (!scan_pipe) { perror("popen failed!"); return -1; } sleep(3); // 预留3秒扫描时间 // 打开文件存储扫描结果,也可以改用数组实现内存存储 FILE *result_file = fopen("bt_scan_results.txt", "w"); if (result_file) { while (fgets(buffer, BUFFER_LEN, scan_pipe) != NULL) { // 打印带Debug前缀的内容 printf("Debug: %s", buffer); // 把结果写入文件保存 fputs(buffer, result_file); } fclose(result_file); } else { perror("Failed to open result file"); } pclose(scan_pipe); return 0; }
关键修改说明
- 管道模式调整:把
popen的第二个参数从"w"改成"r",让管道连接到子进程的标准输出,才能读取扫描结果。 - 输出重定向:在命令末尾加
2>&1,把hcitool lescan的标准错误输出转到标准输出,保证所有扫描内容都能通过管道捕获。 - 错误处理修复:去掉
popen失败后的pclose调用,避免空指针操作。 - 结果存储:新增文件写入逻辑,扫描结果会被保存到
bt_scan_results.txt,如果需要内存存储,换成数组或者动态链表即可。
验证效果
运行修正后的程序,终端输出会和你预期的一致:
root@device100:~# bt_service Debug: LE Scan ... Debug: 76:AC:17:0C:B8:CF (unknown) Debug: 23:61:7A:13:08:E2 (unknown) ...
同时扫描结果会被写入指定文件,方便后续处理。
内容的提问来源于stack exchange,提问作者CHC
相关产品推荐
相关产品推荐

