c++ - 当我使用 '|' 或 '<' 时到底发生了什么,c++

标签 c++ linux bash shell

我有一个非常简单的程序:

void main()
{
    fgets(buf,133,stdin);
    printf( buf);
    system("/bin/dash");
}

当我启动程序时,一切正常,我可以输入任何我想要的内容,然后我就有了一个 shell。但是如果我这样做了

$ echo 'blabla' | ./test

为了自动填充 buf(无需使用键盘键入任何内容),将执行 shell,但是/bin/ls 可以正常工作。 (显然显示命令工作正常)

如果我删除 fgets 行,并执行相同的命令,它可以工作,但将 'blabla' 作为/bin/dash 的参数。但是,添加 nul 字符或返回 '\xd' 以在 fgets 中模拟我的键盘返回不起作用

我想了解当我使用“|”时会发生什么我的 C++ 程序中的符号。我认为这是无需任何人工交互即可自动填充 scanfs 和 fgets 的解决方案,我做错了吗还是有其他解决方案?

谢谢。

Debian,C++ g++

最佳答案

当你执行echo 'blabla' | ./test 在您的 shell 中,shell 将启动一个 echo 进程并将其标准输出管道连接到 ./test 的标准输入管道。这与 C++ 无关:这些管道是大多数操作系统的一个特性,几乎每个进程都有它们。

当您的程序执行 system 时,您正在创建一个(或多个)连接到相同标准输入管道的新进程。因此,如果该管道中有一些数据(来自 echo 命令)尚未被 test 读取,则您启动的进程将可以读取这些数据系统

使用 echo 和管道是一种向 fgetsscanf 提供输入的好方法。将数据传递给程序的另一种方法是使用环境变量或命令行参数,但您需要修改代码以检查这些内容。

关于c++ - 当我使用 '|' 或 '<' 时到底发生了什么,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336522/

相关文章:

c++ - 添加了破坏 .text 部分的 pe 可执行部分

c++ - 字符串中字符之间的空格

c++ - 重载运算符以处理类对象?

regex - 读取命令的输出或从文件中读取

bash - 切换到 zsh shell -- `ls` 结束终端选项卡

bash - bash 的代码格式化程序/美化程序(在命令行中)?

c++ - 在不使用 C++ 中的字段名称的情况下打印实例化结构的值

ruby - RVM 安装系统范围的 Git 依赖项

c - linux 中的 readdir 在哪里?

mysql - 如何使用 bash 脚本写入 mysql 表