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ể.