Я пытаюсь сделать exec()
дочерний процесс из родительского процесса. В этом дочернем процессе я прошу пользователя ввести сообщение, чтобы оно могло быть распечатано родительским процессом, но я не могу найти способ сделать это ...Как подключить stdin от дочернего к родительскому?
До сих пор мой код:
parent.c
int main(int argc, char **argv) {
int fd[2];
char line[80];
pipe(fd);
pid_t pid = (pid_t)fork();
if(pid > 0) {
waitpid(pid, NULL, 0);
close(fd[0]);
int size = read(fd[1], line, 79);
close(fd[1]);
line[size] = '\0';
printf("[parent] Received \"%s\", size = %d\n", line, size);
}
else {
close(fd[1]);
close(stdin);
dup2(fd[0], stdin);
close(fd[0]);
exec("./child", 0, NULL);
}
return 0;
}
child.c
int main(int argc, char **argv) {
char line[80];
printf("[child] Enter message: ");
gets(line, 80);
printf("[child] line = %s\n", line);
return 0;
}
При запуске родительского процесса , он отображает [child] Enter message:
, но когда я пытаюсь ввести что-то, ничего не появляется, даже если я нажимаю клавишу возврата.
Вы знаете, как я могу заставить его работать?
Благодарим за помощь.
В родительском доме не дожидайтесь, пока ребенок закончит, прежде чем читать из трубы. Он может работать в этом случае, потому что вы, вероятно, недостаточно писали, чтобы заполнить буфер труб, но если он будет заполнен, писатель будет блокироваться, и у вас есть тупик. –
Кроме того, какая версия функции 'gets' имеет размер буфера? Вы используете какой-то вариант 'gets_s'? –
Есть также некоторые другие проблемы с вашей родительской программой. Например, он не должен компилироваться чисто. –