1
我想管在C并行地,但由于某种原因,它不是关闭...它只是在等待....不知道如果我所描述的这口井因为我是新的在这一点,但这里的代码平行管道不在C中关闭?
... some code up here
if(child_pid == 0) {
if(p0 >=0 && p1 == -1) {
dup2(p0, STDIN_FILENO);
close(p0);
close(p1);
}
else if (p0 == -1 && p1 >= 0) {
dup2(p1, STDOUT_FILENO);
close(p0);
close(p1);
}
else if (p0 >= 0 && p1 >=0) {
dup2(p0, STDIN_FILENO);
dup2(p1, STDOUT_FILENO);
close(p0);
close(p1);
}
if (input)
iofunc(input, 0);
if (output)
iofunc(output, 1);
if (sub){
command_exec (SUBSHELL_COMMAND, sub, -1, -1, -1);
exit(0);
}
else {
execvp(w[0], w);
exit(0);
}
}
else {
if (waitpid (-1, &child_status, 0) != child_pid)
child_status =-1;
close(p0);
close(p1);
return WEXITSTATUS(child_status);
}
... some code down here
当P0 == -1 & & P1> = 0,则处理退出/返回,但由于某种原因,当P0> = 0 & & P1 == -1,处理只是挂起和管道不关闭。我运行了一个命令ls |猫使用两个并行的子进程,ls写入p1,猫读取p0。输出是正确的,但管道没有关闭,猫从不退出。到底是怎么回事?
@William我想在我的父母else块以下的,但它并没有在这里工作
close(p0);
close(p1);
if (waitpid (-1, &child_status, 0) != child_pid)
child_status =-1;
@William是调用,调用上面的代码
int i = 0;
int num = 2;
int status;
pid_t pid;
pid_t pids[num];
int fd[2];
int p = pipe(fd);
int a;
int b;
//printf("pipe0:%d\n", fd[0]);
//printf("pipe1:%d\n", fd[1]);
for (i = 0; i < num; i++) {
if ((pids[i] = fork()) < 0) {
error(1,0, "child not forked");
} else if (pids[i] == 0) {
if (i == 0){
b = command_exec (c->type,
c->u.command[1],
0, f[0], p1);
}
else if (i == 1){
a = command_exec (c->type,
c->u.command[0],
1, p0, fd[1]);
}
exit(a && b);
}
}
while (num > 0) {
pid = wait(&status);
printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
num--;
}
一个函数的代码
的printf的只打印子进程结束LS但不是猫
您需要出示包括管道()调用和fork()调用的代码。只要所有写入端的文件描述符与猫的标准输入相关的管道关闭,猫就会终止。你所描述的问题几乎肯定是关闭文件描述符的失败。可能猫的调用本身仍然是开放的。 – 2012-02-05 03:34:49
当你叉,家长有管开放的两端。除非在某些时候你分配P1 = FD [1],父母永远不会关闭FD [1]。因为cat正在等待更多的数据,所以Cat不会终止,直到父节点关闭该文件描述符。 – 2012-02-05 16:39:26