Trên hệ thống POSIX, các tín hiệu kết thúc thường có thứ tự sau (theo nhiều trang MAN và Thông số POSIX):
SIGTERM - lịch sự yêu cầu một quá trình kết thúc. Nó sẽ kết thúc một cách duyên dáng, dọn dẹp tất cả các tài nguyên (tệp, ổ cắm, quy trình con, v.v.), xóa các tệp tạm thời, v.v.
SIGQUIT - yêu cầu mạnh mẽ hơn. Nó sẽ chấm dứt sự vô phúc, vẫn dọn dẹp các tài nguyên thực sự cần dọn dẹp, nhưng có thể không xóa các tệp tạm thời, có thể viết thông tin gỡ lỗi ở đâu đó; trên một số hệ thống cũng sẽ ghi một kết xuất lõi (bất kể tín hiệu có được ứng dụng bắt hay không).
SIGKILL - yêu cầu mạnh mẽ nhất. Quá trình này thậm chí không được yêu cầu làm bất cứ điều gì, nhưng hệ thống sẽ dọn dẹp quá trình, cho dù có như vậy hay không. Nhiều khả năng một kết xuất lõi được viết.
Làm thế nào để SIGINT phù hợp với bức tranh đó? Quá trình CLI thường bị SIGINT kết thúc khi người dùng nhấn CRTL + C, tuy nhiên, quá trình nền cũng có thể bị SIGINT kết thúc bằng cách sử dụng tiện ích KILL. Những gì tôi không thể thấy trong thông số kỹ thuật hoặc tệp tiêu đề là liệu SIGINT có mạnh hơn hay ít hơn SIGTERM hoặc nếu có bất kỳ sự khác biệt nào giữa SIGINT và SIGTERM.
CẬP NHẬT:
Mô tả tốt nhất về các tín hiệu kết thúc mà tôi tìm thấy cho đến nay là trong Tài liệu GNU LibC . Nó giải thích rất rõ rằng có sự khác biệt dự kiến giữa SIGTERM và SIGQUIT.
Nó nói về SIGTERM:
Đó là cách bình thường để yêu cầu một chương trình chấm dứt một cách lịch sự.
Và nó nói về SIGQUIT:
[...] và tạo ra một kết xuất lõi khi nó kết thúc quá trình, giống như một tín hiệu lỗi chương trình. Bạn có thể coi đây là tình trạng lỗi chương trình được người dùng “phát hiện”. [...] Tốt nhất bạn nên bỏ qua một số loại dọn dẹp khi xử lý SIGQUIT. Ví dụ: nếu chương trình tạo các tệp tạm thời, nó sẽ xử lý các yêu cầu chấm dứt khác bằng cách xóa các tệp tạm thời. Nhưng tốt hơn hết là SIGQUIT không nên xóa chúng, để người dùng có thể kiểm tra chúng cùng với kết xuất lõi.
Và SIGHUP cũng được giải thích đủ rõ. SIGHUP không thực sự là một tín hiệu kết thúc, nó chỉ có nghĩa là "kết nối" với người dùng đã bị mất, vì vậy ứng dụng không thể mong đợi người dùng đọc thêm bất kỳ đầu ra nào (ví dụ: đầu ra stdout / stderr) và không có đầu vào để mong đợi từ người dùng nữa. Đối với hầu hết các ứng dụng có nghĩa là chúng tốt hơn nên thoát. Về lý thuyết, một ứng dụng cũng có thể quyết định rằng nó chuyển sang chế độ daemon khi nhận được SIGHUP và hiện đang chạy như một quy trình nền, ghi đầu ra vào tệp nhật ký đã định cấu hình. Đối với hầu hết các daemon đã chạy ở chế độ nền, SIGHUP thường có nghĩa là chúng sẽ kiểm tra lại các tệp cấu hình của mình, vì vậy bạn gửi nó đến các quy trình nền sau khi chỉnh sửa tệp cấu hình.
Tuy nhiên, không có giải thích hữu ích nào về SIGINT trên trang này, ngoài việc nó được gửi bởi CRTL + C. Có lý do gì khiến người ta xử lý SIGINT theo cách khác với SIGTERM không? Nếu vậy thì lý do này là gì và cách xử lý sẽ khác như thế nào?
sudo fuser -l
vào dấu nhắc lệnh của bạn. Đối với tôi điều này gợi lên:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
cho một danh sách các tín hiệu.