【问题标题】:Parent gets EOF when child quits after getting an EOF?当孩子在获得 EOF 后退出时,父母会获得 EOF?
【发布时间】:2019-04-21 07:35:07
【问题描述】:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    int ch;
    pid_t p = fork();

    if (p == 0) {
        do {
            ch = getchar();
        } while (ch >= 0);
        return 0;
    }
    int s;
    waitpid(p, &s, 0);
    printf("A done\n");
    p = 0;
    do {
        ch = getchar();
    } while (ch >= 0 && (++p));
    printf("chars: %d\n", p);
    return 0;
}

这是一个最小的示例代码。理论上它应该读取一些字符直到EOF,然后打印A done,然后再读取一些字符,然后告诉你A done之后还有多少。

但是,在我的 Windows 子系统 Linux (Ubuntu 18.04) 上,当我第一次按 Ctrl-D 时, 子进程和父进程都退出(收到 EOF)。我得到的输出类似于

asdfghjkl
^DA done
chars: 0

这是为什么呢?我该如何解决这个问题?

【问题讨论】:

  • 它们共享相同的输入流。
  • @user3386109 如果我在父级中使用 GNU readline,我可以向父级发送一些东西 - 任何解决方案?

标签: c linux fork eof


【解决方案1】:

fork(2) 中,文件描述符是dup(2)ed,因此它们共享相同的文件指针,因此其中一个进程读取的内容不会被另一个进程读取。

【讨论】:

    猜你喜欢
    • 2019-10-14
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多