Родитель получает EOF, когда дочерний элемент завершает работу после получения EOF?

#c #linux #fork #eof

#c #linux #вилка #eof #fork

Вопрос:

 #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, amp;s, 0);
    printf("A donen");
    p = 0;
    do {
        ch = getchar();
    } while (ch >= 0 amp;amp; (  p));
    printf("chars: %dn", p);
    return 0;
}
  

Вот минимальный пример кода. Теоретически он должен прочитать некоторые символы до EOF, и распечатать A done , и прочитать еще несколько символов, и показать вам, сколько их осталось после A done .

Однако в моей подсистеме Windows для Linux (Ubuntu 18.04), когда я нажимаю Ctrl-D в первый раз, как дочерний, так и родительский процессы завершаются (получает EOF). Результат, который я получаю, выглядит примерно так

 asdfghjkl
^DA done
chars: 0
  

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

Комментарии:

1. Они используют один и тот же входной поток.

2. @user3386109 Я могу отправить что-то родительскому, если я использую GNU readline в родительском — любое решение?

Ответ №1:

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