引言
今天遇到一个需求,我们有某个厂家提供的二进制可执行程序,该程序运行时,通过一步步输入指定数字的选项,最后它会修改硬件设备的某些信息,由于我们无法获取二进制程序的源码,于是我换了一种思路,在我们自己的代码里想办法去运行这个厂家的二进制程序,那么问题来了,如何在代码中实现需要交互的那几个步骤呢?
方法
我的思路是,既然二进制程序需要我们的输入,那我们就给它呗,经过一番调研以及论坛提问交流,找到了一个办法:
echo -e “信息1\n信息2\n信息3” | 二进制文件
其中,| 是管道定向,将双引号的内容定向到后面的二进制程序中。
实现
我们知道,system()函数的作用是,执行括号中的shell命令,也就是向dos发送一条指令。
system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回。
原调用的进程.,在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT 和SIGQUIT 信号则会被忽略。
比如,在代码程序内部想获取当前目录下的文件名,很简单,可以这样:
system("ls");
但是问题来了,我们上述的 echo -e “信息1\n信息2\n信息3” | 二进制文件 方法,内部还有双引号,这个时候怎么办呢?
首先,-e选项是指:
-e:激活转义字符。使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
•\a 发出警告声;
•\b 删除前一个字符;
•\c 最后不加上换行符号;
•\f 换行但光标仍旧停留在原来的位置;
•\n 换行且光标移至行首;
•\r 光标移至行首,但不换行;
•\t 插入tab;
•\v 与\f相同;
•\\ 插入\字符;
•\nnn 插入nnn(八进制)所代表的ASCII字符;
也就是说-e在这里是为了\n而使用了,那么双引号问题怎么解决?办法就是使用转义符 \,最终结果如下:
system("echo -e \"1\n1\n1\nQ\n\" | 我的二进制程序")