Помогите с реализацией обработчиков сигналов через signal () - PullRequest
1 голос
/ 19 апреля 2010
void main ()
{
  int c;

  signal (SIGINT, Handle);
  while (( c = getchar()) != '\n' );

  return();
}

void Handle(signum) 
{
   signal {SIGINT, Handle); 
   printf ("beep \n");
}

Я думал, что он будет печатать звуковой сигнал, пока не будет нажата какая-либо клавиша, но вызов метода находится вне цикла? : S

Ответы [ 3 ]

4 голосов
/ 19 апреля 2010

Вы регистрируете Handle () как обработчик для SIGINT. Сигнал SIGINT отправляется, когда пользователь пытается прервать программу, поэтому, если вы запустите эту программу, он должен напечатать звуковой сигнал, если вы нажмете control-c.

См. Некоторые документы о SIGINT , о функции signal () и об ее использовании .

Как указывает Тим ​​ниже, используйте sigaction () вместо signal ().

0 голосов
/ 19 апреля 2010

Помимо использования sigaction ...

Пожалуйста, измените обратный вызов на НЕ вызывайте printf. Printf вызывает системный вызов write () и записывает в стандартный выходной буфер, смешиваясь с вызовами main. В обработчике сигналов следует избегать как системных вызовов, так и изменения stdout.

Вместо этого установите переменную флага sig_atomic_t в обработчике сигналов, а затем проверьте и отмените ее и выполните printf в основном цикле.

0 голосов
/ 19 апреля 2010

Handle вызывается только тогда, когда в код подается сигнал INT (наиболее вероятно, когда вы нажимаете CTRL C или CTRL BREAK хотя есть и другие способы поднять этот сигнал), не непрерывно во время ожидания нажатия клавиши.

Вы также обнаружите, что линии

signal {SIGINT, Handle);

и

return();

- опечатки - первая скобка должна быть круглой скобкой, а для второй следует использовать return 0;. Кроме того, main должен возвращать целое число, если вы хотите соответствовать стандартам.

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