2014-12-01 16 views
5

Tôi có mã này, nơi tôi sử dụng sigaddset và sigaction. Tuy nhiên, nếu tôi nhận xét kết quả seg_sset giống nhausigaddset được sử dụng để làm gì?

struct sigaction act; 

    act.sa_handler = process_alarm; 
    act.sa_flags = 0;   
    sigemptyset(&act.sa_mask); 
    //sigaddset(&act.sa_mask, SIGINT); 

    sigaction(SIGALRM, &act, NULL); 

    for(;;) 
    { 
     alarm(3); 
     pause(); 
    } 

Tại sao tôi cần sử dụng?

+1

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() '? –

+0

@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

Trả lời

12

Bạn đang làm 2 điều ở đây:

  1. Populating một sigset_t. Một sigset_t chỉ là một tập hợp các giá trị cho các tín hiệu và được sử dụng trong các cuộc gọi hệ thống khác nhau. Bạn có thể:

    • Tạo một sigset_t rỗng (sigemptyset()
    • Thêm một tín hiệu để các thiết lập (sigaddset())
    • Di chuyển một tín hiệu để các thiết lập (sigdelset())
    • , vv ..
  2. Đặt mặt nạ tín hiệu cho bộ xử lý tín hiệu.Bạn làm điều đó bằng cách thao tác thành viên sigset_t sa_mask của struct sigaction khi bạn thiết lập trình xử lý tín hiệu với cuộc gọi đến sigaction().

Tín hiệu mặt nạ của một xử lý tín hiệu có nghĩa là trong khi xử lý tín hiệu được thực hiện, các tín hiệu có trong mặt nạ sẽ bị chặn - tức là những tín hiệu sẽ không được xử lý như miễn là họ đang bị chặn. Khi bộ xử lý tín hiệu kết thúc, các tín hiệu sẽ được bỏ chặn. Tín hiệu bị chặn không bị "mất", tín hiệu sẽ bị xử lý khi tín hiệu cụ thể đó được bỏ chặn lại.

sigaddset(&act.sa_mask, SIGINT); nghĩa là tín hiệu SIGINT không thể xảy ra trong khi mã xử lý SIGALRM đang chạy.

Mặt khác, nếu bạn nhận xét sigaddset(&act.sa_mask, SIGINT);, bạn chỉ còn lại một danh sách các dấu hiệu trống được tạo với sigemptyset(&act.sa_mask);. Vì vậy, bất kỳ tín hiệu nào xảy ra trong khi chức năng xử lý SIGALRM đang chạy có thể ưu tiên trình xử lý đó và thực hiện trình xử lý tín hiệu cho tín hiệu kia. Đối với một SIGINT, bạn thường sẽ không nhận thấy bất kỳ sự khác biệt nào với kiểm tra thủ công - bạn không thể quản lý CTRL-C chính xác khi trình xử lý của bạn cho SIGALRM đang chạy, và trình xử lý SIGALRM của bạn có thể chạy đủ nhanh mà bạn sẽ không nhận thấy nếu SIGINT hơi chậm trễ.

0

sigaddset được sử dụng để thêm mặt nạ tín hiệu tương ứng vào biến sigset_t đó.

Trong khớp nối, không bắt buộc. Bạn có thể sử dụng nó khi bạn đang sử dụng sigprocmask để chặn tín hiệu mà chúng ta đề cập đến trong biến đó.

5

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.

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