Điều gì xảy ra với một quá trình Linux đa luồng nếu nó nhận được tín hiệu?


20

Nếu một quá trình Unix (Posix) nhận được tín hiệu, bộ xử lý tín hiệu sẽ chạy.

Điều gì sẽ xảy ra với nó trong một quá trình đa luồng? Chủ đề nào nhận được tín hiệu?

Theo tôi, API tín hiệu nên được mở rộng để xử lý điều đó (nghĩa là có thể xác định được trình xử lý tín hiệu), nhưng khi tìm kiếm thông tin trên mạng tôi chỉ tìm thấy ngọn lửa dài trong danh sách gửi thư của linux linux và trên diễn đàn khác nhau. Theo tôi hiểu, khái niệm của Linus khác với tiêu chuẩn Posix và đầu tiên một số lớp compat được xây dựng, nhưng bây giờ Linux tuân theo mô hình posix.

Tình trạng hiện tại là gì?


3
Bản sao của stackoverflow.com/questions/11679568/ '"pthreads (7) mô tả rằng POSIX.1 yêu cầu tất cả các luồng trong một thuộc tính chia sẻ quy trình, bao gồm cả xử lý tín hiệu"
steve

@steve Cảm ơn, nhưng 1) nó ở trên một trang SE khác 2) thông số này không xác định rõ ràng, điều gì sẽ chính xác xảy ra. Điều đó có nghĩa là gì, các trình xử lý tín hiệu sẽ được gọi trên tất cả các luồng, nhưng nó có vẻ hơi siêu thực đối với tôi. 3) Câu trả lời đó không chỉ rõ mô hình của Linus là gì và tại sao / hiện tại nó được sử dụng như thế nào.
peterh - Phục hồi Monica

Câu trả lời:


9

Mục nhập trong POSIX về " Tạo và phân phối tín hiệu " trong "Cơ sở lý luận: Giao diện hệ thống Thông tin chung" cho biết

Tín hiệu được tạo cho một quy trình được gửi đến chỉ một luồng. Do đó, nếu có nhiều hơn một luồng đủ điều kiện để nhận tín hiệu, thì phải chọn một luồng. Việc lựa chọn các luồng hoàn toàn tùy thuộc vào việc triển khai cả hai để cho phép phạm vi triển khai tuân thủ rộng nhất có thể và cho phép triển khai tự do truyền tín hiệu đến luồng "dễ nhất có thể" nếu có sự khác biệt về việc phân phối giữa các luồng khác nhau.

Từ signal(7)hướng dẫn trên hệ thống Linux:

Một tín hiệu có thể được tạo ra (và do đó đang chờ xử lý) cho toàn bộ quá trình (ví dụ: khi được gửi bằng cách sử dụng kill(2)) hoặc cho một luồng cụ thể (ví dụ: một số tín hiệu nhất định, như SIGSEGV và SIGFPE, được tạo ra do hậu quả của việc thực hiện một máy cụ thể - hướng dẫn ngôn ngữ là hướng chủ đề, như là tín hiệu nhắm mục tiêu vào một chủ đề cụ thể bằng cách sử dụng pthread_kill(3)). Tín hiệu theo quy trình có thể được gửi đến bất kỳ một trong các luồng hiện không có tín hiệu bị chặn. Nếu có nhiều hơn một trong các luồng có tín hiệu được bỏ chặn, thì nhân chọn một luồng tùy ý để phát tín hiệu.

Và trong pthreads(7):

Chủ đề có cài đặt ngăn xếp tín hiệu thay thế khác nhau. Tuy nhiên, các cài đặt ngăn xếp tín hiệu thay thế của một luồng mới được sao chép từ luồng đã tạo ra nó, để các luồng ban đầu chia sẻ một ngăn xếp tín hiệu thay thế (cố định trong kernel 2.6.16).

Từ pthreads(3)hướng dẫn trên hệ thống OpenBSD (như một ví dụ về cách tiếp cận thay thế):

Trình xử lý tín hiệu thường được chạy trên ngăn xếp của luồng hiện đang thực thi.

(Hiện tại tôi không biết cách xử lý việc này khi nhiều luồng đang thực thi đồng thời trên máy đa bộ xử lý)

Việc triển khai LinuxThread cũ hơn của các luồng POSIX chỉ cho phép các luồng riêng biệt được nhắm mục tiêu theo tín hiệu. Từ pthreads(7)hệ thống Linux:

LinuxThreads không hỗ trợ khái niệm tín hiệu hướng quy trình: tín hiệu chỉ có thể được gửi đến các luồng cụ thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.