Как правильно получить стандартный ввод с клавиатуры в дочернем процессе? - PullRequest
0 голосов
/ 19 февраля 2019

Я использую следующую программу на Си в Linux.

Программа

// program.c
#include <stdio.h>
#include <unistd.h>

int main() {
    if (fork() == 0) { // child process
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d + %d = %d\n", a, b, a + b);
    }
    return 0;
}

Ожидаемое поведение

$ ./program
1 2
1 + 2 = 3

Фактическое поведение

$ ./program
$ 1222245440 + 32764 = 1222278204

Когда я запускаю программу в терминале, программа вскоре выдаст странный вывод, такой как 1222245440 + 32764 = 1222278204, и не ждет, пока я наберу текст.Я думаю, что проблема в том, что стандартные потоки ввода и вывода дочернего процесса не привязаны к терминалу.Вместо этого потоки родительского процесса присоединяются.В результате дочерний процесс не может получить мой ввод с клавиатуры.Есть ли способ решить эту проблему?Я имею в виду, чтобы отделить потоки родительского процесса и присоединить потоки дочернего процесса.По какой-то причине я должен получать входные данные в дочернем процессе.

1 Ответ

0 голосов
/ 19 февраля 2019

Мне кажется, проблема в том, что стандартные потоки ввода и вывода дочернего процесса не привязаны к терминалу.Вместо этого присоединяются потоки родительского процесса.

Родительский процесс не ожидает дочернего процесса и немедленно возвращается.Ребенок-сирота не может читать из терминала, «странный вывод» получен из значений мусора из a и b.Посмотрите, что возвращает scanf, запустите этот код:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    int wstatus;
    if (fork() == 0) { // child process
        int a, b, n;
        n=scanf("%d %d", &a, &b);
        printf("(%d returned) %d + %d = %d\n", n, a, b, a + b);
    }
//    wait(&wstatus);
    return 0;
}

Скорее всего, вы получите что-то вроде (-1 returned) 1222245440 + 32764 = 1222278204.Затем раскомментируйте wait и попробуйте снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...