2017-09-25 3 views
0

Ich bin auf der Suche nach Informationen zwischen einem Elternteil und einem Kind. Zur Zeit werde ich vom STDERR des Elternteils zum STDIN des Kindes leiten und den STDOUT des Kindes lesen, indem ich das andere Ende des Dateideskriptors lese. Ich habe das folgende unten getan, aber kämpfe mit dem Kind, das aussteigen muss, bevor ich lesen kann. Wie kann ich das Kind AusgangLesen und Schreiben von Kind-Prozessen während des Lebens und der laufenden

Loops zwischen Kind durch die Linie ständig Leseleitung verarbeitet

for (int currentP = 0; currentP < inputs.playerCount; currentP++) { 
      char currentPlayerC[2]; 
      sprintf(currentPlayerC, "%d", currentP); 
      char* currentPlayerT = argv[3+currentP]; 

      int fds[2]; 
      int fds1[2]; 
      pipe(fds); 
      pipe(fds1); 
      char buff[10]; 
      memset(buff, 0, sizeof(buff)); 
      if ((pids[currentP] = fork()) < 0) { 
        perror("fork"); 
        abort(); 
      } else if (pids[currentP] == 0) { //Child 
        close(fds[PIPE_READ]); 
        close(fds1[PIPE_WRITE]); 
        dup2(fds[PIPE_WRITE], STDOUT_FILENO); 
        dup2(fds1[PIPE_READ], STDIN_FILENO); 
        close(fds1[PIPE_READ]); 
        close(fds[PIPE_WRITE]); 
        execlp(CHILD PROCESS THAT PRINTS TO STDOUT READS FROM STDIN)) 
        _exit(0); 
        return BADSTART; 
      } else { //parent 
        dup2(fds1[PIPE_WRITE], STDERR_FILENO); 
        close(fds[PIPE_WRITE]); 
        close(fds1[PIPE_READ]); 
        fprintf(stderr, "game_over\n"); //ENDS CHILD 
        read(fds[PIPE_READ], buff, sizeof(buff)); 
        //Will continue forever unless I put in game_over 
        close(fds1[PIPE_WRITE]); 
        close(fds[PIPE_READ]); 
      } 

}

+0

Sie Ausgabe von dem Kind erhalten, sobald das Kind die Ausgabe schreibt. Vielleicht müssen Sie die Pufferungsstrategie im Kind anpassen, z. indem Sie die Pufferung für 'stdout' ausschalten oder an geeigneten Stellen' fflush() 'aufrufen. – fuz

+0

Die OP-Frage handelt von einem Laufzeitproblem, aber der veröffentlichte Code ist nur ein Fragment. Bitte posten Sie ein [mcve] – user3629249

+0

bezüglich: '_exit (0); return BADSTART; 'Die Anweisung 'return' wird NIEMALS ausgeführt – user3629249

Antwort

0

diese Zeile:

read(fds[PIPE_READ], buff, sizeof(buff)); 

wird ewig warten, wenn das Kind verlassen.

vorschlagen:

if(wanting child to exit) 
{ 
    int status; 
    fprintf(stderr, "game_over\n"); //ENDS CHILD 
    wait(&status); 
    return 0; 
} 

fprintf(stderr, "next command to child\n"); 
read(fds[PIPE_READ], buff, sizeof(buff)); 
Verwandte Themen