Comment envoyer un signal à un processus en C?

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:

  • seules certaines fonctions peuvent être appelées à partir de gestionnaires de signaux: Pourquoi seules les fonctions async-signal-safe peuvent être appelées à partir de gestionnaires de signaux en toute sécurité?
  • des fonctions différentes ont des comportements différents lorsqu’elles sont interrompues par des signaux: man 7 signal , SA_RESTART
  • Les variables globales ne sont accessibles à partir du gestionnaire de signaux que si elles ont le type sig_atomic_t : Comment fonctionne réellement sig_atomic_t?

Testé sous Ubuntu 17.10, GitHub en amont .