У меня есть следующий пример программы:
#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.