【发布时间】:2016-12-02 16:11:31
【问题描述】:
我正在尝试让两个子进程通过管道相互通信。
一个孩子应该继续从标准输入读取,将它读取的内容传递到管道,而另一个孩子应该从管道读取并将其打印到标准输出。
我设法让它工作,但只有一次,在读取数字后的第二次迭代中,我得到:write failed: Bad file descriptor。
我不知道我做错了什么......
#define READ 0
#define WRITE 1
int main(){
int pipe_descs[2];
int retval = pipe(pipe_descs);
int pid = fork();
if(pid == 0){ //son that reads from stdin and writes to pipe
close(pipe_descs[READ]);
int x;
while(1){
open(pipe_descs[WRITE]);
scanf("%d", &x);
if(write(pipe_descs[WRITE], &x, sizeof(int)) != sizeof(int)){
perror("write failed");
exit(EXIT_FAILURE);
}
close(pipe_descs[WRITE]);
}
perror("");
}
else if(pid > 0){ //parent
int pid = fork();
if(pid == 0){ //son that reads from pipe and write to stdout
int pipestat;
int readNum;
close(pipe_descs[WRITE]);
while((pipestat = read(pipe_descs[READ], &readNum, sizeof(int))) > 0){
printf("read: %d \n", readNum);
//close(pipe_descs[READ]);
//open(pipe_descs[READ]);
}
if (pipestat==-1) {
perror("");
fprintf(stderr, "error to pipe... exiting\n");
exit(EXIT_FAILURE);
}
}
}
int status;
int i = 2;
while (i > 0){
wait(&status);
i--;
}
}
【问题讨论】:
-
你认为
open(pipe_descs[WRITE]);会做什么?其次,为什么要在循环中关闭它?废话。