linux下使用system()接口时,内部命令需要带引号 & c代码控制交互二进制程序

引言

今天遇到一个需求,我们有某个厂家提供的二进制可执行程序,该程序运行时,通过一步步输入指定数字的选项,最后它会修改硬件设备的某些信息,由于我们无法获取二进制程序的源码,于是我换了一种思路,在我们自己的代码里想办法去运行这个厂家的二进制程序,那么问题来了,如何在代码中实现需要交互的那几个步骤呢?

方法

我的思路是,既然二进制程序需要我们的输入,那我们就给它呗,经过一番调研以及论坛提问交流,找到了一个办法:

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\" | 我的二进制程序")
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值