В чем разница между обычным вызовом функции и системным вызовом signal ()? - PullRequest
1 голос
/ 10 декабря 2011

При изучении системного вызова signal () я должен был найти следующий код:

#include <stdio.h>
#include <signal.h>
void sigproc(int);
void quitproc(int);

int main(int argc,char **argv)
{
 signal(SIGINT, sigproc); //Is it like a normal Call to signal()?
 signal(SIGQUIT, quitproc);// This too?
 printf("ctrl- c disabled use ctrl\ to quit \n");
 while(1);
 return 0;
}

void sigproc(int signo)
{
printf("you have pressed ctrl - c \n");
}

void quitproc(int signo)
{
  printf("U cant quit\n");
//  exit(0);
}

Я дважды вызываю функцию signal () в main ().Но он выполняется только когда я нажимаю клавиши Ctrl-C и Ctrl- \.Я думал, что это как нормальный вызов функции.Что на самом деле происходит в функциях обработчика сигнала?

1 Ответ

4 голосов
/ 10 декабря 2011

Функция signal устанавливает обработчик сигнала.Что это значит: « Когда мой процесс получает этот сигнал, запустите эту функцию вместо того, чтобы делать то, что было по умолчанию ».

Итак, в вашем примере вызовы signal не вызывайте функцию .Чтобы реально увидеть сигналы в действии, сделайте следующее:

  • Запустите процесс на одном терминале
  • С другого терминала:

    kill -INT `pidof proc`
    

Как примечание, printf и друзья не защищены от асинхронного сигнала.Это может шокировать, но небезопасно использовать их в обработчиках сигналов .


В качестве примечания, даже если вы отметили свой вопрос Unix, важнознать, что сигналы (и функция signal) являются стандартными, неотъемлемыми частями C. Обработка сигналов и функция signal описаны в C99 в §7.14.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...