#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)
, поэтому они используют один и тот же указатель на файл, и то, что считывает один из процессов, не считывается другим, как следствие этого.