【问题标题】:File descriptors and pipe in CC中的文件描述符和管道
【发布时间】: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


【解决方案1】:

正确的输出肯定不是2。当您在分叉之前关闭管道时,两个进程现在如何关闭pipe[1]。当子进程尝试写入管道时,它将无法写入。因此,父级将读取1,因为2 从未写入pipe[1]

【讨论】:

  • 如果我有:n=22;写(p[1], &n, sizeof(int));关闭(p[0]); if(fork() == 0) { int r = read(p[0], &n, sizeof(int)); printf("r = %d\n", n); .Will 工作,读取将返回 22
  • 请看上面的例子。我在 fork 之前关闭了读取描述符,并且读取仍在工作
  • 这可能是因为您正试图读取一个已经是 22 的变量。所以读取失败,但 n 已经是 22。看起来它正在工作,但实际上您只是在打印取出你设置的变量n=22;
猜你喜欢
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多