2013-01-03 13 views
5

Pracuję nad linuxem i zdałem sobie sprawę, że moja aplikacja zostawiła procesy demona, kiedy zamykam go za pomocą przycisku "Stop" na IDE kreatora Qt. Chcę obsłużyć te przypadki, aby aplikacja zamknęła się tak samo, jak po zamknięciu głównego okna. Aby napisać programy obsługi, muszę wiedzieć, które sygnały odpowiadają.sygnały wysyłane przez qtcreator na "stop"

+0

To byłoby SIGTERM myślę. – sashoalm

Odpowiedz

7

Pogłębianie kodu QtCreator, widzę, że QtCreator używa wewnętrznie QProcess do uruchomienia aplikacji. Czerwony przycisk "stop" jest połączony z ApplicationLauncher::stop(), który kończy proces na jeden z dwóch sposobów w zależności od tego, czy jest to aplikacja GUI, czy aplikacja konsolowa, ale w obu przypadkach wynik kończy się na Linuxie.

Dla aplikacji GUI, ApplicationLauncher dzwoni QProcess::terminate(), która z kolei wysyła sygnał SIGTERM (na Linux) do twojego demona. Następnie czeka (z waitForFinished()) przez 1 sekundę, a jeśli demon nie zakończył pracy do tego czasu, wywołuje QProcess::kill(), wysyłając SIGKILL.

W przypadku aplikacji konsolowej, ApplicationLauncher deleguje zakończenie do klasy narzędzia ConsoleProcess. W systemie Linux numer ConsoleProcess::stop() będzie podobny do ApplicationLauncher dla aplikacji GUI, która po raz pierwszy wysyła SIGTERM, a następnie czeka na 1 sekundę i wysyła SIGKILL, jeśli jeszcze nie została zakończona.

Znajdziesz odpowiedni kod z Qt Creator tutaj:

+0

schludna odpowiedź Fred. – UmNyobe

+1

@Fred Więc odpowiednie linki do kodu mają zastosowanie do "Uruchamiania" aplikacji - jednak oczywiście te bloki są nieistotne podczas "Debugowania" aplikacji. Każdy pomysł, gdzie do odpowiednich operacji stop/kill są do debugowania? Być może po prostu instruuje on gdb, by jakoś wykonał tę akcję z killem? – dtmland

0

Krótka wersja: Nie można

Długa wersja:

Można spróbować użyć:

http://doc.qt.digia.com/qt/qcoreapplication.html#aboutToQuit

Ale to nie będzie działać zgodnie z oczekiwaniami. Jeśli proces zostanie przerwany siłą (co robi stop w IDE, zgaduję, używając TerminateProcess() w systemie Windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx), wtedy proces jest natychmiastowo zabijany w środku tego, co wykonuje. Nie można obsłużyć tych przypadków z samego Qt.