2017-09-25 2 views
0

Je cherche à transmettre des informations entre un parent et un enfant. Actuellement, je passe du STDERR du parent au STDIN de l'enfant et je lis le STDOUT de l'enfant en lisant l'autre extrémité du descripteur de fichier. J'ai fait ce qui suit ci-dessous mais je suis aux prises avec l'enfant qui a besoin de sortir avant que je puisse lire. Comment puis-je lire ligne en permanence par la ligne de sortie de l'enfantLire et écrire des processus enfants en cours de fonctionnement

boucles entre l'enfant traite

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

Vous recevez la sortie de l'enfant dès que l'enfant écrit la sortie. Vous devez peut-être ajuster la stratégie de mise en mémoire tampon de l'enfant, par ex. en désactivant la mise en mémoire tampon pour 'stdout' ou en appelant' fflush() 'aux endroits appropriés. – fuz

+0

La question OP concerne un problème d'exécution, mais le code affiché n'est qu'un fragment. Veuillez poster un [mcve] – user3629249

+0

concernant: '_exit (0); return BADSTART; 'L'instruction 'return' ne sera JAMAIS exécutée – user3629249

Répondre

0

cette ligne:

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

attendra indéfiniment si l'enfant est sorti.

Suggérer:

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));