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 u,ses gets() which is unsafe.
Hello "testName"
bash$

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос