Bộ tín hiệu được điều khiển thông qua loại sigset_t
. Một số hoạt động có sẵn cho các tín hiệu bộ:
- tạo ra một tập S rỗng qua
sigemptyset
, S = ∅
- thêm một tín hiệu của một tập S qua
sigaddset
, S = S∪ {s}
- remove một tín hiệu từ một bộ thông qua
sigdelset
, S = S \ {s}
- tạo tập hợp tất cả các tín hiệu có thể qua
sigfillset
.
- kiểm tra là một tín hiệu nằm trong một tập hợp S đã cho qua số
sigismember
, s∈S?
một bộ như vậy được sử dụng ở nhiều nơi khác nhau: thiết lập một mặt nạ tín hiệu quá trình mới, chặn thiết trong xử lý tín hiệu, yêu cầu tập hợp các tín hiệu chờ giải quyết, vv
Nếu bạn muốn bắt tín hiệu khác nhau, nó có thể xuất hiện một số chức năng bắt buộc không được gián đoạn với các chức năng khác, vì vậy bạn có thể thêm một bộ tín hiệu bị chặn trong quá trình phân phối tín hiệu đã cho. Bạn thực sự quyết định (khi không được chú ý) để chặn SIGINT trong quá trình phân phối SIGALRM. Vì vậy, bạn chỉ có thể quan sát điều này bằng cách gửi một SIGINT trong quá trình thực thi trình xử lý; rất khó để nhận ra.
Ví dụ về việc nó có thể quan trọng ở đâu?
Giả sử rằng trình xử lý SIGUSR1 sửa đổi cấu trúc dữ liệu đã cho và trình xử lý cho SIGUSR2 sử dụng cùng cấu trúc dữ liệu đó. Điều rất quan trọng để làm cho cả hai trình xử lý không đồng thời, có thể chạy sau trình xử lý khác nhưng có thể bạn không muốn bị gián đoạn bởi trình xử lý khác trong quá trình phân phối. Mã của bạn là tự đồng thời, nói rằng ngay cả trong trường hợp chỉ có một luồng, tín hiệu có thể dẫn bạn đến sự đồng thời.
Nguồn
2014-12-01 14:43:50
bạn đã thử nhấn 'CTRL + C' khi chạy chương trình của bạn có/không có chú thích' sigaddset() '? –
@SouravGhosh có nhưng như đã chỉ ra trong các câu trả lời khác, trình xử lý cảnh báo chạy nhanh để nhận thấy hiệu ứng của nó. Thêm một 'sleep (10)' trong trình xử lý và tôi có thể thấy sự khác biệt :) – NeDark