2011-05-06 29 views
7

Điều này có vẻ như một câu hỏi ngớ ngẩn, nhưng tôi không thể tìm thấy câu trả lời cho nó ở bất cứ nơi nào tôi nhìn. Tôi biết rằng trong UNIX, các tín hiệu được xử lý không đồng bộ. Nếu tôi viết một hàm xử lý tín hiệu, hàm đó chạy ở đâu? Chủ đề mới có sinh ra không? Chủ đề hiện tại có bị gián đoạn không? Hay điều này được xử lý trong một luồng hệ thống như I/O không đồng bộ?Các tín hiệu không đồng bộ được xử lý như thế nào trong Linux?

Trả lời

2

Chuỗi quy trình hiện tại bị gián đoạn cho đến khi hàm trả về. Có những hạn chế nghiêm trọng về những gì nó có thể làm một cách an toàn để đảm bảo nó không làm hỏng trạng thái của các cuộc gọi hàm mà luồng nằm ở giữa - đặc biệt, bất kỳ hàm nào mà nó gọi là luồng có thể đã được gọi phải là reentrant async. Xem trang người đàn ông, ví dụ: tín hiệu, sigaction để biết thêm chi tiết hoặc đặt câu hỏi cụ thể hơn tùy thích.

6

Chức năng tín hiệu được thực hiện như thể một luồng trong quy trình bị gián đoạn. Nghĩa là, trình xử lý tín hiệu được gọi bằng cách sử dụng luồng được báo hiệu và ngăn xếp được sắp xếp lại sao cho khi trình xử lý tín hiệu trả về chuỗi tiếp tục thực hiện. Không có chủ đề mới nào được giới thiệu.

2

Đây không phải là một chuỗi riêng biệt, nhưng mã của bạn bị treo nhanh chóng. Đó là lý do tại sao chỉ có một tập con giới hạn của các cuộc gọi POSIX.

Từ signal man page:

Việc xử lý thường xuyên phải rất cẩn thận, vì chế biến ở nơi khác bị gián đoạn tại một số điểm tùy ý. POSIX có khái niệm về "chức năng an toàn". Nếu một tín hiệu ngắt một hàm không an toàn, và trình xử lý gọi một hàm không an toàn, thì hành vi là không xác định. Các chức năng an toàn được liệt kê rõ ràng trong các tiêu chuẩn khác nhau.

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