• # Un exemple simple pere/fils

    Posté par . En réponse au message Communication entre deux processus pere-fils bloquante. Évalué à 1.

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main(int argc, char* argv[])
    {
     int pid = 0;
     int pipefd[2];
     char buf= 0;
     printf("Hello, Vador before the fork\n");
     if(pipe(pipefd)== -1){
     perror("Pipe");
     exit(-1);
     }
     pid = fork();
     if(pid == -1) {
     perror("Fork");
     exit(-1);
     } 
     if(pid){
     printf("I'm Vador\n");
     close(pipefd[0]);
     buf = 1;
     write(pipefd[1],&buf,1);
     close(pipefd[1]);
     wait(pid);
     }else{
     printf("I'm Skywalker\n");
     close(pipefd[1]);
     buf = 0;
     read(pipefd[0],&buf,1);
     if(buf){
     printf("I'm the force\n");
     }
     close(pipefd[0]);
     }
     exit(0);
    }

    La fonction "read" est bloquante par défaut. Tant qu'il n'y a rien dans le pipe, le processus fils attend.

    Apres, tu as un grand nombre de possibilité, mais le plus simple si tu veux que le fils attende pour faire une action c'est de jouer avec des sémaphores (http://linux.die.net/man/7/sem_overview). Ainsi quand le pere a écrit, il incrémente de 1 la sémaphore, le fils qui appele le sémaphore le décrémente de 1 et tu joues avec une mémoire partagée ou un pipe bidirectionnel.

    Ainsi tant que tu ne modifie pas la valeur du sémaphore, le fils dort. La sémaphore est un bon moyen de gérer la synchro entre père/fils.