execv * и напишите в stdin

Я пытаюсь запустить программу с определенным стандартный ввод. Мне удалось использовать файловый дескриптор файла, в котором есть то, что я хочу вставить в стандартный ввод, но я не могу писать прямо на стандартный ввод:

$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;
}
6
задан Bastien 11 November 2011 в 12:34
поделиться