x4r*_*rkz 3 c++ linux bash shell
我有一个非常简单的程序:
void main()
{
fgets(buf,133,stdin);
printf( buf);
system("/bin/dash");
}
Run Code Online (Sandbox Code Playgroud)
当我启动程序时,一切正常,我可以输入我想要的任何内容然后我有一个shell.但是,如果我这样做
$ echo 'blabla' | ./test
Run Code Online (Sandbox Code Playgroud)
为了自动填充buf(不用键盘输入任何内容),执行shell,但/ bin/ls工作正常.(显然显示命令工作正常)
如果我删除fgets行,并执行相同的命令,它可以工作,但将'blabla'作为/ bin/dash的参数.但是,添加一个空字符或返回'\ xd'以模拟我的键盘在fgets中的返回不起作用
我想了解当我使用'|'时会发生什么 我的c ++程序中的符号.我认为这是自动填充scanfs和fgets而无需任何人工干预的解决方案,我做错了还是还有其他解决方案?
谢谢.
Debian,C++ g ++
echo 'blabla' | ./test在shell中执行时,shell将启动一个echo进程并将其标准输出管道连接到标准输入管道./test.这与C++无关:这些管道是大多数操作系统的一个特性,几乎每个进程都有它们.
程序执行时system,您将创建连接到同一标准输入管道的新过程(或多个过程).因此,如果该管道(来自echo命令)中有一些尚未被读取的数据test,则可以由您开始使用的进程读取system.
使用echo和管道是一种向fgets和提供输入的好方法scanf.将数据传递给程序的另一种方法是使用环境变量或命令行参数,但是您需要修改代码以检查这些内容.