2016-05-29 2 views
-1

У меня есть простая программа для демонстрации обработки сигналов в C для Linux. Я просто сложно это для экспериментирования ..Linux: игнорирование сигнала внутри обработчика сигнала, игнорирование всех таких последовательных сигналов

void sigquit(int signo) 
{ 
    printf("Recieved signo : %d\n",signo); 
    signal(SIGQUIT,SIG_IGN); 
} 

int main() 
{ 

    /* register the signal handler */ 
    if(signal(SIGQUIT,sigquit) == SIG_ERR) 
    { 
     perror("Error handling SIGQUIT signal"); 
     exit(1); 
    } 
    for(;;); 
    return 0; 
} 

Я получаю результат:

^\Recieved signo : 3 
^\^\^\^\^\^\^\ 

, тогда как я ожидал этого:

^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 
    ^\Recieved signo : 3 

Почему только первый раз, когда мой обработчик был вызван и не далее. Я ожидал, что сигналы будут впервые поступать в основной поток, а затем передаваться обработчикам.

+0

Так в чем же идея этой строки 'сигнал (SIGQUIT, SIG_IGN),' хотя? ;-) – alk

ответ

3

сигнал (SIGQUIT, SIG_IGN);

Из вашего обработчика сигналов вы сказали своей программе игнорировать дальнейшие случаи сигнала. В результате, когда вы посылаете сигнал снова, он игнорируется, как вы сказали.

+0

Путаница, вероятно, объясняется моим пониманием. До сих пор я считаю, что, когда программа начинается с 'main()', она видит, что я хочу зарегистрировать 'sigint()' как обработчик. Таким образом, он (не уверен, что компилятор или во время выполнения) регистрирует 'sigint' для вызова каждый раз, когда поступает сигнал. То, что находится внутри 'sigint()', не имеет значения. Это может помочь http://unix.stackexchange.com/questions/80044/how-signals-work-internally. Я изучаю его больше, чтобы получить работу. –

+0

"* Что внутри sigint() не имеет значения. *" Почему? : -S @InsaneCoder Попробуйте положить 'int i = 0; i/= i; 'внутри обработчика. :-) – alk

+0

@InsaneCoder вы заставляете его звучать так, как компилятор ясновидящий. Это не относится к делу. Ваша программа запускается по одной команде за раз. Как только обработчик сигнала был зарегистрирован, и пока не будет дана другая инструкция, всякий раз, когда принимается сигнал, обработчик вызывается и запускается по одной команде за раз. Вы поставили код внутри вашего обработчика, чтобы остановить это, и система действительно остановилась. –

Смежные вопросы