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]);
}
}
你从孩子只要孩子写输出接收输出。也许你需要调整孩子的缓冲策略,例如关闭'stdout'的缓冲或在适当的位置调用'fflush()'。 – fuz
OP的问题是关于运行时问题,但发布的代码只是一个片段。请发布[mcve] – user3629249
关于:'_exit(0); return BADSTART;''return'语句永远不会执行 – user3629249