J’ai besoin d’envoyer un signal à un processus et lorsque le processus reçoit ce signal, il fait certaines choses, comment cela est-il mieux réalisé en C?
Le moyen d’envoyer un signal à un processus est kill(pid, signal);
Toutefois, vous devez savoir que les signaux ne constituent pas un moyen efficace de communication interprocessus, à l’exception des messages parent à enfant direct en raison de conditions de concurrence inhérentes. Pipes, fichiers, répertoires, sémaphores nommés, sockets, mémoire partagée, etc. constituent des approches bien supérieures pour la communication interprocessus.
Si vous êtes sur l’un des unix:
homme 2 tuer
signal homme 2
homme 2 sigvec
kill
+ fork
exécutable exemple POSIX
Temps pour s’amuser:
#define _XOPEN_SOURCE 700 #include #include #include /* false */ #include /* perror */ #include /* EXIT_SUCCESS, EXIT_FAILURE */ #include /* wait, sleep */ #include /* fork, write */ void signal_handler(int sig) { char s1[] = "SIGUSR1\n"; char s2[] = "SIGUSR2\n"; if (sig == SIGUSR1) { write(STDOUT_FILENO, s1, sizeof(s1)); } else if (sig == SIGUSR2) { write(STDOUT_FILENO, s2, sizeof(s2)); } signal(sig, signal_handler); } int main() { pid_t pid; signal(SIGUSR1, signal_handler); signal(SIGUSR2, signal_handler); pid = fork(); if (pid == -1) { perror("fork"); assert(false); } else { if (pid == 0) { while (1); exit(EXIT_SUCCESS); } while (1) { kill(pid, SIGUSR1); sleep(1); kill(pid, SIGUSR2); sleep(1); } } return EXIT_SUCCESS; }
Comstackr et exécuter:
gcc -std=c99 signal_fork.c ./a.out
Résultat:
SIGUSR1 SIGUSR2 SIGUSR1 SIGUSR2 ....
Mais prenez garde qu’il y a beaucoup de complexités dans le traitement des signaux:
man 7 signal
, SA_RESTART
sig_atomic_t
: Comment fonctionne réellement sig_atomic_t? Testé sous Ubuntu 17.10, GitHub en amont .