Подтвердить что ты не робот

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

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


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

int main(int argc, char *argv[])
{
  alarm(2);                     /* set alarm clock          */
  while (1)
    ;
  printf("All done");
}

Я ожидаю, что программа будет печатать "привет" через 2 секунды, но вместо этого вывод будет "zsh: alarm./a.out"

Любая идея, что происходит?

4b9b3361

Ответ 1

Вы забываете сначала установить обработчик будильника. Измените начало 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    */
}

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

Ответ 2

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

Прежде чем вы выполните alarm(2), поместите signal(SIGALRM, ALARMhandler); в свой main.

Затем он должен работать.

Обратите внимание, что ваш "All Done" никогда не будет напечатан, потому что вы останетесь в цикле 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;
}

Ответ 3

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

int main(int argc, char *argv[])
{
  signal(SIGALRM, ALARMhandler);     /* install the handler    */
  alarm(2);                     /* set alarm clock          */
  while (1);
}

Ответ 4

Андомар строгий. Я проверяю это и, Версия 1 печатает (каждую секунду):

Hi...
Hi...
Hi...
Hi...
BYE
Hi...
...

версия 2 (каждые пять секунд):

Hi...Hi...Hi...Hi...BYE
Hi...Hi...Hi...Hi...BYE
...

Итак, код:

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

# define T 5

int flag = T;

void sigalrm_handler(int);

int  main(void)
{
    signal(SIGALRM, sigalrm_handler);   
    alarm(1);                         
    while (1);  
}

void sigalrm_handler(int sig)
{
    if(--flag){
        printf("Hi...\n");   /*version 1*/
        /*printf("Hi...");*/ /*version 2*/
    }else{
        printf("BYE\n");
        flag=T;     
    }
    alarm(1);
}