2017-09-25 85 views
0

我正在寻找管道父母和孩子之间的信息。目前,我通过读取文件描述符的另一端读取父节点的STDERR到孩子的STDIN并读取孩子的STDOUT。我已经完成了以下内容,但是在我能够阅读之前我正在努力与孩子需要退出。我怎样才能不断地读取一行一行孩子的输出子女之间在活着和跑步时读取和写入子进程

循环处理

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

你从孩子只要孩子写输出接收输出。也许你需要调整孩子的缓冲策略,例如关闭'stdout'的缓冲或在适当的位置调用'fflush()'。 – fuz

+0

OP的问题是关于运行时问题,但发布的代码只是一个片段。请发布[mcve] – user3629249

+0

关于:'_exit(0); return BADSTART;''return'语句永远不会执行 – user3629249

回答

0

这一行:

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

将永远等待,如果孩子退出。

推荐:

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