- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个非常简单的程序:
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
和管道是一种向 fgets
和 scanf
提供输入的好方法。将数据传递给程序的另一种方法是使用环境变量或命令行参数,但您需要修改代码以检查这些内容。
关于c++ - 当我使用 '|' 或 '<' 时到底发生了什么,c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336522/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!