2016-11-20 2 views
2

QT에서 BLE 스캔을하기 위해 Linux/Bluez 도구 hcitool을 사용하려고합니다. 모든 결과를 저장하기 위해 다음리눅스에서 hcitool을 실행하는 QProcess를 종료 하시겠습니까?

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 

그래서 어떤 아이디어? (주석에서 이동)

+0

콘솔에서 Ctrl-C가 제대로 작동하면 동일한 작업을 수행하려면 SIGKILL이 아니라 SIGINT 신호를 보내야합니다. –

+0

예, QT에서 종료 신호를 보낼 때 무슨 일이 일어 났을까요? ... "stdbuf를 통해 hcitool을 실행했기 때문일 수 있습니까? – Jolle

+2

'QProcess :: terminate'는'SIGINT'보다는'SIGTERM'을 전송합니다. ':: kill (hcitool-> processId(), SIGINT)'를 시도해 볼 수있다. 'stdbuf' *는 신호 처리 방법에 따라 문제가 될 수 있습니다. –

답변

1

일반적으로 종종 적절하게 처리하는 자식 프로세스,에 SIGHUP 또는 SIGPIPE를 제공해야합니다 단지 close() 스트림에 있습니다 작동 트릭.