无法在 linux 上终止 QProcess 运行 hcitool?
Cant terminate QProcess running hcitool on linux?
我正在尝试使用 Linux/Bluez 工具:hcitool,从 QT 进行 BLE 扫描。
我使用以下打开流程:
QString program = "sudo stdbuf -oL hcitool -i hci0 lescan";
hcitool = new QProcess();
connect(hcitool, SIGNAL(started()), this, SLOT(hcitool_started()));
connect(hcitool, SIGNAL(finished(int)), this, SLOT(hcitool_finished(int)));
connect(this, SIGNAL(kill_hcitool()), hcitool, SLOT(kill()));
connect(this, SIGNAL(terminate_hcitool()), hcitool, SLOT(terminate()));
hcitool->start(program, QProcess::Unbuffered | QProcess::ReadWrite);
然后我不断地从进程中读取存储所有结果:
QString result = hcitool->readLine();
几秒钟后,我想停止 hcitool 进程,这就是问题所在。我试过终止信号、kill 信号、将 ^C 写入进程,但没有任何效果。
实际上kill信号结束了进程。但不是很好,因为之后我的 hci0 被阻止了,在 hci0 被重置之前我无法再次启动 hcitool:
hciconfig hci0 down
hciconfig hci0 up
关于如何正确终止此进程有什么想法吗?
(从评论中移出)
一个通常有效的技巧是 close()
流,它应该给子进程一个 SIGHUP 或 SIGPIPE,通常处理得更优雅。
我正在尝试使用 Linux/Bluez 工具:hcitool,从 QT 进行 BLE 扫描。
我使用以下打开流程:
QString program = "sudo stdbuf -oL hcitool -i hci0 lescan";
hcitool = new QProcess();
connect(hcitool, SIGNAL(started()), this, SLOT(hcitool_started()));
connect(hcitool, SIGNAL(finished(int)), this, SLOT(hcitool_finished(int)));
connect(this, SIGNAL(kill_hcitool()), hcitool, SLOT(kill()));
connect(this, SIGNAL(terminate_hcitool()), hcitool, SLOT(terminate()));
hcitool->start(program, QProcess::Unbuffered | QProcess::ReadWrite);
然后我不断地从进程中读取存储所有结果:
QString result = hcitool->readLine();
几秒钟后,我想停止 hcitool 进程,这就是问题所在。我试过终止信号、kill 信号、将 ^C 写入进程,但没有任何效果。
实际上kill信号结束了进程。但不是很好,因为之后我的 hci0 被阻止了,在 hci0 被重置之前我无法再次启动 hcitool:
hciconfig hci0 down
hciconfig hci0 up
关于如何正确终止此进程有什么想法吗?
(从评论中移出)
一个通常有效的技巧是 close()
流,它应该给子进程一个 SIGHUP 或 SIGPIPE,通常处理得更优雅。