execve («/ bin / sh», 0, 0); в канале

У меня есть следующий пример программы:

#include <stdio.h>

int
main(int argc, char ** argv){
    char buf[100];

    printf("Please enter your name: ");
    fflush(stdout);
    gets(buf);
    printf("Hello \"%s\"\n", buf);

    execve("/bin/sh", 0, 0);
}

Я и когда я запускаю без конвейера, он работает так, как должен, и возвращает сообщение sh :

bash$ ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
testName
Hello "testName"
$ exit
bash$

Но это не работает в канале, Думаю, я знаю, почему это так, но не могу найти решения. Пример выполнения приведен ниже.

bash$ echo -e "testName\npwd" | ./a.out
Please enter your name: warning: this program uses gets() which is unsafe.
Hello "testName"
bash$

Я полагаю, это как-то связано с тем, что получает очищает stdin таким образом, что / bin / sh получает EOF и сразу завершает работу. без сообщения об ошибке.

Но как мне обойти это (если возможно, не изменяя программу и не удаляя , получает , если нет), чтобы я получал подсказку, даже если я подаю ввод через канал?

] PS Я запускаю это на машине FreeBSD (4.8) D.S.

10
задан A. Nilsson 14 December 2011 в 17:36
поделиться