#define _POSIX_C_SOURCE 200112L #include #include #include #include #include "err.h" /*----------------------------------------------------------------------. | Programme lançant un fils, puis: | | - Le père affiche les entiers impairs de 1 à 9999, | | - le fils affiche les entiers pairs de 0 à 10000. | | | | On veut que l'affichage soit fait dans l'ordre croissant 0, 1, 2,... | | | | On utilise les signaux: lorsqu'un des processus a écrit un entier, | | il prévient l'autre en lui envoyant SIGUSR1 et passe en pause(), | | attendant de recevoir lui-même SIGUSR1. | | | | Le programme met en évidence un problème: si SIGUSR1 est reçu | | avant le passage en pause(), le processus est bloqué pour | | toujours. | | | | Correction possible: utiliser sigsuspend() à la place de pause(). | `----------------------------------------------------------------------*/ void f(int s) { } int main(int argc, char **argv) { int n; struct sigaction a; a.sa_handler = f; sigemptyset(&a.sa_mask); a.sa_flags = 0; sigaction(SIGUSR1, &a, NULL); switch (n = fork()) { case -1: FATAL("fork"); exit(EXIT_FAILURE); case 0: for (int i = 0; i < 10000 ; i+=2) { printf("%d\n", i); kill (getppid(), SIGUSR1); pause(); } break; default: for (int i = 1; i < 10000 ; i+=2) { pause(); printf("%d\n", i); kill (n, SIGUSR1); } break; } }