2013-04-02 21 views
5

Nếu một quá trình linux đang chờ I/O (nghĩa là nó đang ở trong trạng thái SLEEP) và một tín hiệu SIGKILL được ban hành chống lại nó, khi chấm dứt (STOPPED nhà nước) nó sẽ đi qua RUNNING hoặc READY nhà nước?SIGKILL tín hiệu xử lý

Nói cách khác, để có một quy trình xử lý gián đoạn hệ thống như được tạo bởi SIGKILL, có cần vượt qua trạng thái RUNNING hoặc READY không?

Biết rằng trong trường hợp bình thường, quy trình có thể xử lý gián đoạn từ hạt nhân và biết rằng SIGKILL có mục đích khá mâu thuẫn với việc giết chết tín hiệu không phản hồi, tôi nghi ngờ về khả năng kiểm soát quá trình bị giết. tất cả các.

+0

'SIGKILL' là một ví dụ không may vì đây là tín hiệu không thể xử lý bởi quá trình nhận. Nếu câu hỏi của bạn không liên quan đến 'SIGKILL' và đó là một ví dụ đơn giản, hãy xem xét sử dụng một tín hiệu khác để thể hiện ý của bạn. – nemo

Trả lời

5

Tín hiệu được "chuyển giao" cho một tiến trình bởi hạt nhân, do đó việc gửi tín hiệu từ processA đến processB sẽ sử dụng hạt nhân. Khi SIGKILL được phân phối hạt nhân không cho phép bất kỳ hoạt động nào của quá trình (chế độ người dùng), cụ thể là quá trình tóm tắt: atexit calls, _exit. Không có gì. Quá trình này chỉ đơn giản là bị phá hủy bởi hệ thống. Điều này liên quan đến một số hoạt động trong chế độ hạt nhân. Dữ liệu đệm bị mất. Các semaphores SYSV và các đối tượng bộ nhớ liên tục khác của hạt nhân còn lại trong bộ nhớ. Nó có thể là một mớ hỗn độn thực sự.

Nếu một cái gì đó trong bộ nhớ hạt nhân đang gây ra một treo bạn sử dụng giao diện SysRq trong linux:

http://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/security-sysrq.html

--Để thực hiện bất cứ điều gì semblance của một shutdown lệnh bạn có thể nhận được.

Đây là lý do tại sao sử dụng SIGKILL là phương sách cuối cùng tuyệt đối, vì bạn không thể biết mình đang phá vỡ điều gì. Và nó sẽ không sửa chữa tất cả các hang.

Chính xác bạn đang làm việc gì?

+0

Tôi không nghĩ câu hỏi của OP là đặc trưng cho 'SIGKILL'. Tôi hiểu nó hơn là "không một quá trình cần phải được hoạt động để xử lý một tín hiệu". – nemo

+0

Quá trình phải có ngữ cảnh CPU để nhận tín hiệu. SIGKILL hơi khác một chút. Các tiến trình có hai thành phần - hạt nhân - đôi khi được gọi là P0, mã vùng của người dùng, gọi nó là P1. P0 và P1 chỉ đơn giản là quay trở lại bể bơi phân trang không được phân trang và bộ nhớ hệ thống khi SIGKILL được hạt nhân nhặt. Một số thứ như semaphores ở trong bộ nhớ kernel. Vì vậy, trong ý nghĩa này P1 không bao giờ trở thành hoạt động. Bạn chắc chắn có thể lập luận rằng một số hoạt động P0 đang trong ngữ cảnh quy trình, nhưng mã chế độ người dùng của bạn không thể làm bất cứ điều gì về nó. –

+0

Có, tôi biết điều đó và bài đăng của bạn đã nói rằng 'SIGKILL' không thể được xử lý. Nhưng tôi không nghĩ rằng OP đang yêu cầu 'SIGKILL' nhưng tất cả các tín hiệu nói chung. Vì vậy, câu đầu tiên của bạn bình luận là câu trả lời cho câu hỏi của OP IMO. – nemo