Простые Сигналы - C программирование и функция аварийной сигнализации

TextMate является великим редактором, и существует способ копировать часть функциональности в GEdit. Проверьте статью здесь: http://rubymm.blogspot.com/2007/08/make-gedit-behave-roughly-like-textmate.html для изменения GEdit для поведения как TextMate.

25
задан qwer 23 November 2009 в 16:07
поделиться

3 ответа

Вы забываете изначально установить обработчик аварийных сигналов. Измените начало main () , например:

int main(int argc, char *argv[])
{
   signal(SIGALRM, ALARMhandler);
   ...

Кроме того, обработчик сигнала, вероятно, ничего не напечатает. Это потому, что библиотека C кэширует вывод до тех пор, пока не увидит конец строки. Итак:

void  ALARMhandler(int sig)
{
  signal(SIGALRM, SIG_IGN);          /* ignore this signal       */
  printf("Hello\n");
  signal(SIGALRM, ALARMhandler);     /* reinstall the handler    */
}

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

33
ответ дан 28 November 2019 в 20:47
поделиться

Вы не устанавливаете обработчик в своей функции main .

Перед тем как сделать alarm (2) , установите signal (SIGALRM, ALARMhandler); в вашем main .

Тогда он должен работать.

Обратите внимание, что ваше «Все готово» никогда не будет напечатано, потому что вы останетесь в while (1) цикл после запуска сигнального процессора. Если вы хотите, чтобы цикл был прерван, вам понадобится флаг, который изменит обработчик сигнала.

#include <stdio.h>
#include <signal.h>

/* number of times the handle will run: */
volatile int breakflag = 3;

void handle(int sig) {
    printf("Hello\n");
    --breakflag;
    alarm(1);
}

int main() {
    signal(SIGALRM, handle);
    alarm(1);
    while(breakflag) { sleep(1); }
    printf("done\n");
    return 0;
}
9
ответ дан 28 November 2019 в 20:47
поделиться

Вы не устанавливаете сначала обработчик сигналов.
Вам необходимо сообщить системе, что вы хотите обработать сигнал, до того, как он будет получен, поэтому вам нужно вызвать signal () из основного до того, как сигнал придет.

int main(int argc, char *argv[])
{
  signal(SIGALRM, ALARMhandler);     /* install the handler    */
  alarm(2);                     /* set alarm clock          */
  while (1);
}
5
ответ дан 28 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: