我有以下示例程序:
#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
promt:
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$
我认为这与以下事实有关gets
空了stdin
以这样的方式/bin/sh
收到 EOF 并立即退出,且不显示错误消息。
但是我该如何解决这个问题(如果可能的话,不修改程序,也不删除gets
,如果没有),这样即使我通过管道提供输入,我也会收到提示?
附:我在 FreeBSD (4.8) 机器上运行它
您可以运行您的程序而不需要任何修改,如下所示:
(echo -e 'testName\n'; cat ) | ./a.out
这样您就可以确保程序的标准输入不会在以下内容之后结束echo
输出。反而,cat
继续向您的程序提供输入。后续输入的来源是您的终端,因为这是cat
读取自。
这是一个示例会话:
bash-3.2$ cc stdin_shell.c
bash-3.2$ (echo -e 'testName\n'; cat ) | ./a.out
Please enter your name: warning: this program uses gets(), which is unsafe.
Hello "testName"
pwd
/home/user/stackoverflow/stdin_shell_question
ls -l
total 32
-rwxr-xr-x 1 user group 9024 Dec 14 18:53 a.out
-rw-r--r-- 1 user group 216 Dec 14 18:52 stdin_shell.c
ps -p $$
PID TTY TIME CMD
93759 ttys000 0:00.01 (sh)
exit
bash-3.2$
请注意,由于 shell 的标准输入未连接到终端,sh
认为它不是交互式执行的,因此不显示提示。不过,您可以正常键入命令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)