【发布时间】:2021-03-12 07:09:30
【问题描述】:
我尝试让 2 个子进程进行通信:
void demo() {
int pipes[2];
int create_pipe_status = pipe(pipes);
int status;
pid_t fork_id = fork();
if(!fork_id) {
//parent
status = dup2(pipes[1], STDOUT_FILENO);
close(pipes[0]);
close(pipes[1]);
}
pid_t fork_id2 = fork();
if(!fork_id2){
//child
status = dup2(pipes[0], STDIN_FILENO);
close(pipes[0]);
close(pipes[1]); //keep
}
wait(NULL);
wait(NULL);
}
当我尝试关闭与管道关联的文件描述符时,我在errno 中收到错误EBADF (bad file descriptor)。
我的错误是什么?
【问题讨论】:
-
您的代码没有错误检查或处理。你怎么知道你得到了那个错误?
-
你调用了两次fork,所以现在你有四个进程。其中至少有一个正在尝试关闭管道[0] 两次。
-
@dratenik 你确定吗?似乎它关闭了孩子们的管道,不是吗?
-
@Shawn 是的,我也发现了,已修复 :) 我什至不确定它实际上是 0 还是 1,这段代码的咖啡量不够。
-
@thecorrectanswer OP 没有提到故障发生在哪里,我认为是其中一个孩子(可能同时执行了两个 if)。
标签: c unix pipe fork child-process