Родитель получает EOF, когда ребенок уходит после получения EOF? - PullRequest
1 голос
/ 21 апреля 2019
#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

Почему это так?И как мне это исправить?

1 Ответ

0 голосов
/ 24 апреля 2019

В fork(2) файловые дескрипторы dup(2) редактируются, поэтому они совместно используют один и тот же указатель файла, и то, что читает один из процессов, не читается другим, как следствие этого.

...