2017-05-23 10 views
0

J'ai un tuyau, un parent et un processus fils. Le parent lit à partir d'un fichier certaines données, le met dans le tube, et après, l'enfant devrait lire toutes les données. Mon problème est le suivant: mon parent lit les données, l'enfant reçoit les données du tuyau, mais quand il atteint sa fin, le processus se termine, et pas de sortie après avoir quitté l'instruction while, comme il se doit.Sorties de processus lors de la lecture d'un tuyau

int main(void) 
{ 
    int inputFile, channel[2], PID; 
    if(-1 == pipe(channel)) 
    { 
     perror("Eroare"); 
     return 0; 
    } 
    if(-1 == (inputFile = open("data.txt", O_RDONLY))) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(-1 == (PID = fork())) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(PID != 0) 
    { 
     char buffer; 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     while(1 == read(inputFile, &buffer, 1)) 
      write(channel[1], &buffer, 1); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
    } 
    else 
    { 
     char buffer; 
     while(1 == read(channel[0], &buffer, 1)) 
      printf("%c\n", buffer); 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
     printf("Should output this");  
    } 
    return 0; 
} 

Mon fichier de données contient la chaîne: ABC et la sortie est:

A 
B 
C 

+ 2 lignes vides supplémentaires

Répondre

1

blocs de lecture s'il y a encore d'autres auteurs pour ce descripteur de fichier. Bien que vous ayez fermé le descripteur de fichier qu'avait le parent, le descripteur de fichier de l'enfant est toujours ouvert et ne sera fermé qu'après la lecture de quelque chose d'autre que 1. Cependant, la lecture bloquera, puisque le processus enfant lui-même est considéré comme un écrivain.

Pour résoudre ce problème, il suffit de déplacer l'appel à fermer l'extrémité d'écriture avant de commencer à lire comme ceci:

int main(void) 
{ 
    int inputFile, channel[2], PID; 
    if(-1 == pipe(channel)) 
    { 
     perror("Eroare"); 
     return 0; 
    } 
    if(-1 == (inputFile = open("data.txt", O_RDONLY))) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(-1 == (PID = fork())) 
    { 
     perror("Error"); 
     return 0; 
    } 
    if(PID != 0) 
    { 
     char buffer; 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     while(1 == read(inputFile, &buffer, 1)) 
      write(channel[1], &buffer, 1); 
     if(-1 == close(channel[1])) 
      perror("Error"); 
    } 
    else 
    { 
     char buffer; 
     if(-1 == close(channel[1])) 
      perror("Error"); 
     while(1 == read(channel[0], &buffer, 1)) 
      printf("%c\n", buffer); 
     if(-1 == close(channel[0])) 
      perror("Error"); 
     printf("Should output this");  
    } 
    return 0; 
} 

En outre, seul votre processus principal a été de quitter, l'enfant vivait sur comme un processus devenus orphelins, pour toujours coincé à cet appel à lire.

+0

Mais que se passe-t-il si je veux écrire quelque chose dans l'enfant à la pipe, et après faire parent 'wait (NULL) 'pour l'enfant, de sorte que le parent lise de la pipe ce que l'enfant a écrit? – Peter

+1

Si vous voulez que l'enfant garde le côté écriture du tuyau ouvert, vous ne pouvez pas simplement lire depuis le tuyau jusqu'à ce que le tuyau soit fermé. Vous aurez besoin d'un autre mécanisme pour que le parent informe l'enfant qu'il a écrit toutes les données. –