Я пытаюсь запустить программу с определенным стандартный ввод. Мне удалось использовать файловый дескриптор файла, в котором есть то, что я хочу вставить в стандартный ввод, но я не могу писать прямо на стандартный ввод:
$cat input.test
echo Hello
$
Код C:
int main(int argc, char **argv)
{
int fd = 0;
fd = open("input.test", O_CREAT);
close(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Это работает:
$./a.out
Hello
$
Но если я попробуйте написать прямо в STDIN, используя канал, программа ничего не отображает и продолжает работать:
int main(int argc, char **argv)
{
int fds[2];
pipe(fds);
close(STDIN_FILENO);
dup2(fds[1], STDIN_FILENO);
write(fds[1], "echo Hello;", 11); // Résults are identics with fds[0]
char *const args[] = { "bash", NULL };
execvp("bash", args);
}
Спасибо за вашу помощь
С уважением, Бастьен.
РЕДАКТИРОВАТЬ Проблема решена:
Спасибо за ответы, вот код, который работает:
int main(void)
{
int fd[2];
pid_t pid;
if (pipe(fd) < 0)
return EXIT_FAILURE;
if ((pid = fork()) < 0)
return EXIT_FAILURE;
else if (pid != 0) { /* father */
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
execlp("bash", "bash", (char *)0);
} else { /* son */
close(fd[0]);
write(fd[1], "echo hello\n", 11);
}
return EXIT_SUCCESS;
}