2013-01-03 28 views
5

Tôi đang làm việc trên linux và tôi nhận ra rằng ứng dụng của tôi đã để lại các quy trình daemon khi tôi đóng nó bằng nút "Stop" trên IDE của Qt creator. Tôi muốn xử lý các trường hợp này để ứng dụng đóng cùng một cách như khi tôi đóng cửa sổ chính. Để viết các trình xử lý, tôi cần biết các tín hiệu nào tương ứng với nó.tín hiệu được gửi bởi qtcreator trên "stop"

+0

Đó sẽ là SIGTERM tôi nghĩ. – sashoalm

Trả lời

7

Đào vào mã QtCreator, tôi có thể thấy rằng QtCreator sử dụng QProcess trong nội bộ để khởi chạy ứng dụng của bạn. Nút "dừng" màu đỏ được kết nối với ApplicationLauncher::stop(), kết thúc quá trình của bạn theo một trong hai cách tùy thuộc vào ứng dụng GUI hoặc ứng dụng bảng điều khiển, nhưng trong cả hai trường hợp, kết quả sẽ giống nhau trên Linux.

Đối với ứng dụng GUI, ApplicationLauncher gọi QProcess::terminate(), do đó sẽ gửi tín hiệu SIGTERM (trên Linux) tới daemon của bạn. Sau đó nó chờ (với waitForFinished()) trong 1 giây, và nếu daemon đã không thoát ra sau đó, nó gọi QProcess::kill(), gửi SIGKILL.

Đối với ứng dụng bảng điều khiển, ApplicationLauncher ủy quyền chấm dứt cho lớp tiện ích ConsoleProcess. Trên Linux, ConsoleProcess::stop() sẽ hoạt động tương tự như ApplicationLauncher cho ứng dụng GUI, đây là lần đầu tiên gửi SIGTERM, sau đó chờ 1 giây và gửi SIGKILL nếu chưa kết thúc.

Bạn sẽ tìm thấy mã có liên quan từ QtCreator đây:

+0

phản ứng gọn gàng Fred. – UmNyobe

+1

@Fred Vì vậy, các liên kết mã có liên quan áp dụng cho "Chạy" một ứng dụng - tuy nhiên tất nhiên các khối này không liên quan khi "Gỡ lỗi" một ứng dụng. Bất kỳ ý tưởng, nơi để hoạt động dừng/giết tương ứng là để gỡ lỗi? Có lẽ nó chỉ đơn giản là hướng dẫn gdb để thực hiện hành động giết thời gian này bằng cách nào đó? – dtmland

0

phiên bản ngắn: Bạn có thể không

dài phiên bản:

Bạn có thể thử sử dụng:

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

Nhưng điều này sẽ không hoạt động như mong đợi. Nếu một quá trình được chấm dứt bởi lực (đó là những gì dừng trong IDE đang làm, tôi đoán sử dụng TerminateProcess() trên windows http://msdn.microsoft.com/en-gb/library/windows/desktop/ms686714(v=vs.85).aspx) sau đó quá trình này ngay lập tức bị giết ở giữa bất cứ điều gì nó đang thực hiện. Nó không thể xử lý các trường hợp này từ Qt một mình.

Các vấn đề liên quan