2012-04-06 25 views
9

Tôi có một ứng dụng máy chủ mà tôi muốn bảo vệ khỏi bị dừng lại bởi bất kỳ tín hiệu nào mà tôi có thể bỏ qua. Có cách nào để bỏ qua tất cả các tín hiệu có thể cùng một lúc, mà không cần đặt chúng từng cái một?Có thể bỏ qua tất cả các tín hiệu không?

Trả lời

12

Có:

#include <signal.h> 

sigset_t mask; 
sigfillset(&mask); 
sigprocmask(SIG_SETMASK, &mask, NULL); 

này không chính xác bỏ qua các tín hiệu, nhưng khối chúng; mà trong thực tế là tác dụng tương tự.

Tôi đoán không cần phải đề cập rằng SIGKILLSIGSTOP không thể bị chặn cũng như bị bỏ qua theo bất kỳ cách nào.

Đối với ngữ nghĩa chi tiết hơn, như quy tắc thừa kế mặt nạ và những thứ tương tự, check the man page

+1

Vui lòng không bao giờ quên kiểm tra giá trị trả lại. Tôi bỏ qua phần đó một cách ngắn gọn. – C2H5OH

+0

... cũng như SIGABRT hoặc SIGSEGV, tôi cho là vậy. –

+1

@KerrekSB: Bạn thực sự có thể bắt được SIGSEGV và SIGBUS, vì vậy tôi đoán bạn cũng có thể bỏ qua chúng. Nguy cơ của riêng bạn, tất nhiên. Trang người dùng [signal (7)] (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html) chỉ đề cập đến 'SIGSTOP' và' SIGKILL'. – C2H5OH

8

tín hiệu Blocking là không giống như bỏ qua chúng.

Khi bạn chặn tín hiệu theo đề xuất của C2H5OH, nó sẽ được thêm vào hàng đợi tín hiệu đang chờ xử lý và sẽ được gửi đến quy trình ngay sau khi bạn bỏ chặn nó.

không chặn có thể được thực hiện bằng

#include <signal.h> 

sigset_t mask; 
sigemptyset(&mask); 
sigprocmask(SIG_SETMASK, &mask, NULL); 

Để trả lời câu hỏi của bạn về làm thế nào để bỏ qua các tín hiệu, nó phải được xử lý bởi một Handler tín hiệu mà là một chức năng người dùng định nghĩa đó thực hiện bất cứ khi nào một tín hiệu được gửi đến quá trình

static void foo (int bar) 
{ 
    /*some code here. In your case, nothing*/ 
} 

sau đó đăng ký chức năng này bằng cách sử dụng

signal(SIGINT,foo); //or whatever signal you want to ignore 

Nếu bạn muốn bỏ qua tất cả các tín hiệu

int i; 
for(i = 1; i <=31 ; i++) 
{ 
    signal(i,foo); 
} 

Mã này sẽ chuyển tất cả các tín hiệu đến quy trình và bỏ qua chúng thay vì chặn chúng.

LƯU Ý: Theo trang người đàn ông, nó không phải là cách được khuyến nghị, thay vào đó, sự thay đổi được đề xuất. Hãy xem man sigaction

2

Các giải pháp dựa trên sigprocmask()pthread_sigmask() đã không hoạt động đối với tôi. Đây là những gì tôi tìm thấy để làm việc:

#include <signal.h> 
#include <unistd.h> 
#include <assert.h> 
int main() { 
    struct sigaction act; 
    act.sa_handler = SIG_IGN; 
    for(int i = 1 ; i < 65 ; i++) { 
     printf("i = %d\n", i); 
     // 9 and 19 cannot be caught or ignored                          
     // 32 and 33 do not exist                              
     if((i != SIGKILL) && (i != SIGSTOP) && (i != 32) && (i != 33)) { 
      assert(sigaction(i, &act, NULL) == 0); 
     } 
    } 
    sleep(10000); 
    return 0; 
} 
Các vấn đề liên quan