Je pratique avec des signaux. Lors de la compilation du code, j’ai reçu des messages d’erreur SIGALRM et SIGSTP non déclarés.
main.c: 46: 16: erreur: signal ‘SIGALARM’ non déclaré (première utilisation dans cette fonction) (SIGALARM, (void (*) (int)) sig_alarm);
main.c: 68: 16: erreur: signal “SIGSTP” non déclaré (première utilisation dans cette fonction) (SIGSTP, (void (*) (int)) int_handler);
#include #include #include #include #include void sig_alarm(int sig){ kill(sig,SIGKILL); } void parent1(int sig){ kill(sig, SIGUSR1); } void parent2(int sig){ if(sig == 0){/*child is running*/ kill(sig, SIGUSR2); }else if(sig > 0){/*parent is running*/ printf("Goodbye!"); exit(0); } } void int_handler(int sig){} void child1(int sig){ printf("Signal received!"); } void child2(int sig){ printf("Child exiting..."); exit(0); } int main(){ pid_t pid; if((pid = fork()) 0){/*parent*/ signal(SIGALARM, (void (*)(int))sig_alarm); alarm(10); signal(SIGTSTP, (void (*)(int))parent1); while(1){ pause(); } alarm(0); signal(SIGALARM, (void (*)(int))sig_alarm); alarm(10); signal(SIGINT, (void (*)(int))parent2); while(1){ pause(); } alarm(0); }else{/*child*/ signal(SIGINT, (void (*)(int))int_handler); signal(SIGSTP, (void (*)(int))int_handler); signal(SIGUSR1, (void (*)(int))child1); while(1){ pause(); } signal(SIGUSR2, (void (*)(int))child2); while(1){ pause(); } } return 0; }
Lisez la page de manuel signal (7) pour obtenir les noms de signaux valides.
Les noms corrects sont SIGTSTP
(ou SIGSTOP
– vous ne SIGTSTP
pas quelle est votre intention exacte) et SIGALRM
.
Notez que SIGSTOP
ne peut pas être attrapé.