Не возвращается запрос терминала после fork-exec-dup - PullRequest
1 голос
/ 19 июля 2011

У меня есть кусок кода, который выглядит так:

pipe(fd);
child_map[0] = fd[0];
child_map[1] = fileno(stdout)
child_map[2] = fileno(stderr);

pid = fork();

if (child_process)
    dup(child_map[0], STDIN_FILENO)
    dup(child_map[0], STDOUT_FILENO)
    dup(child_map[0], STDERR_FILENO)
    execvp(argv[0], argv)  /* child process can be either "grep" or "more" etc */
else if parent_process
    return;

Моя проблема в том, что после того, как я перенаправил вывод в grep / more (который может быть дочерним процессом), я не смог вернуть запрос терминала. Команда o / p хорошо печатается на терминале. Но я не возвращаю приглашение и вижу, что процесс "more" или "grep" выполняется в фоновом режиме. Мне нужно ввести Ctrl + C, чтобы получить подсказку обратно. Я знаю, что это связано с тем, что дескрипторы файлов не закрываются и т. Д., Но я не знаю, как решить эту проблему.

На самом деле это делается из другого контекста процесса. И я вижу, что родительский процесс все еще работает. Это не прекращается, если я не прекращаю это. Таким образом, нет никакого вопроса о том, что ребенок осиротел. [Поднято из комментария Вина, значение уточнения сомнительно -msw]

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Проблема была в неправильном закрытии уже открытых файловых дескрипторов.Некоторые должны были быть закрыты, чего я не сделал.Таким образом, процесс используется для ожидания ввода.

0 голосов
/ 19 июля 2011

Родительский процесс должен ждать завершения дочернего процесса.

...