【发布时间】:2018-06-25 17:44:26
【问题描述】:
我在c中有一个基本管道,我已经向子进程发送了一个整数,子进程将此数字增加1并将发送回父进程。
我的问题是:如果我在写函数之后立即关闭写文件描述符会发生什么?程序会显示1(正确的输出是2)
int main(){
int p[2];
pipe(p);
int n=1;
write(p[1], &n, sizeof(int));
close(p[1]); // don't work => the output is 1
if(fork() == 0) {
read(p[0], &n, sizeof(int));
n = n + 1;
write(p[1], &n, sizeof(int));
close(p[1]);
close(p[0]);
exit(0);
}
wait(0);
read(p[0], &n, sizeof(int));
close(p[0]);
//close(p[1]); works => the output is 2
printf("%d\n", n);
return 1;
}
【问题讨论】:
-
在fork之前关闭管道,子进程将无法写入。
-
没有不同的描述符?例如:父母有自己的描述符,孩子有自己的描述符?,是共享的进程吗?
-
@pcCC28 直到你 fork 之后,还没有子进程。
-
所以child会继承parent的文件描述符?
-
@ritlew 是的,但有点误导:在一个进程中关闭描述符后,您仍然可以在另一个共享描述符的进程中使用它,直到它也关闭描述符。它不是 same 描述符而是副本,不是吗?
标签: c linux pipe file-descriptor