2017-10-15 6 views
0

J'essaie d'envoyer une chaîne, "Hi" de Child1 à Child3 qui sont deux processus frères. Le code s'exécute, cependant je ne reçois pas l'entrée de Child1 dans Child3.Envoi d'une chaîne entre deux processus utilisant des canaux nommés

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <fcntl.h> 
#include <sys/stat.h> 

#define MSGSIZE 1024 

int main (int argc, char *argv[]){ 

    int fd; 
    char * myfifo = "/desktop/myfifo"; 
    char l[MSGSIZE]; 
    pid_t child1, child3; 
    mkfifo(myfifo, 0666); 
    child1 = fork(); 

if (child1 == 0) { 

    printf("I am Child 1: %d \n", (int)getpid()); 
      fd = open(myfifo, O_WRONLY); 
      write(fd, "Hi", MSGSIZE); 
      close(fd); 
    } 

else { 

    if (child1 > 0) { 
     printf("I am parent: %d \n", (int)getpid()); 

     wait(0); 
    } 

    child3 = fork(); 

    if (child3 == 0) { 
     printf("I am Child 3: %d \n", (int)getpid()); 

     fd = open(myfifo, O_RDONLY); 
     read(fd, l, MSGSIZE); 
     printf("Received: %s \n", l); 

     close(fd); 
    } 
} 
    wait(0); 
    unlink(myfifo); 
    return 0; 
} 

J'espère que quelqu'un peut me diriger dans la bonne direction.

+0

et vous ne pensiez pas que vérifier si votre pipe a été créée correctement sera une bonne idée? Vérifiez toujours votre appel système! L'erreur ne peut pas être ignorée. – Stargateur

Répondre

0

Sauf si vous effectuez des E/S non bloquantes, l'ouverture d'une extrémité d'une FIFO se bloque jusqu'à ce que l'autre soit également ouverte. Donc child1 bloque dans son appel open(2) jusqu'à ce que child3 ouvre leur extrémité du tuyau. Cependant, vous appelez également wait(2) dans le processus parent avant vous débutez child3.

Vous avez donc une impasse: Parent attend sur child1 à la fourchette child3, mais child1 est en attente de child3 pour ouvrir l'autre extrémité du tuyau.

Vous pouvez corriger ceci d'au moins deux manières. Tout d'abord, mettez simplement l'appel wait(2) après le fork du deuxième processus fils. L'autre façon est de créer un pipe(2) dans le processus parent, et de laisser les enfants hériter de ces descripteurs et se transmettre les données les uns aux autres de cette façon.