1、exec族函数
精彩博文: https://blog.csdn.net/u014530704/article/details/73848573
path: 比如说 ./a.out
arg: 比如以前的cp demo11.c demo12.c
首先在系统中编译很多的可执行程序
我希望呢,11运行到一半的时候 或者 发生某些情况的时候 11会去调用12,让12去运行
./bin/echoarg :路径名
第一个参数程序名:echoarg
真正的参数是 :abc
然后参数必须以NULL结尾
argc 是参数的个数,把每个参数打出来
比如我们加file1 file2
我希望编译出来的a.out 在执行一半的时候 会调用echoarg,怎么办呢?
用下面的代码
执行失败返回值是-1;会打印execl failed!然后打印after execl
执行成功的话,后面那一句(after execl)根本就不会得到执行
如何找到失败的原因呢?
根据返回值的特性
(perror 的用法)
里面说了没有这个文件或者目录
./bin/echoarg
调用的是bin底下的
./当前文件底下的bin文件夹底下的echoarg
echoarg 直接在当前路径
去掉bin就好啦
after execl 在这里就不执行啦
那可不可以调用ls 呢?(echoarg是可执行程序,ls 也是可执行程序)
先找ls 的绝对路径
等同于我们做了个ls
如果我们想调用ls -l 呢?只要在后面传参就可以啦
如果我们想调用ls -l 呢?只要在后面传参就可以啦
好处是什么呢?
假如让你用c 语言获取系统的时间
你不会获取系统的的时间怎么办?
获取时间有个指令date
代码如下,先看date 的绝对路径
2、带个p的exec族函数
假如我现在要用ps 可是还要whereis ps
这样很麻烦
我如果把绝对路径去掉会发生什么事呢?
找不到
但是加个p就可以啦
那加p是什么意思呢?
查找当前的环境变量
比如我在当前目录,可以执行rechoarg
换个目录就不管用了
那有什么办法让这个路径下也运行echoarg 呢?
我们可以把他配置到环境变量里面去
pwd显示当前路径
![](https://img-blog.csdnimg.cn/20210912200932941.png)
修改环境变量
![](https://img-blog.csdnimg.cn/20210912201410960.png)
原先的可以手动copy进来,也可以直接引用PATH后面加冒号
见证奇迹
![](https://img-blog.csdnimg.cn/20210912201526700.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
都不需要用 ./ 了
都不需要用 ./ 了
我回到工作目录并不在那个目录底下
![](https://img-blog.csdnimg.cn/202109122017303.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
环境变量:
![](https://img-blog.csdnimg.cn/20210912201900412.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
绿色的都可以执行的
![](https://img-blog.csdnimg.cn/20210912202023579.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_13,color_FFFFFF,t_70,g_se,x_16)
所以只写一个ps 没有关系 ,他会找到环境变量底下的ps
![](https://img-blog.csdnimg.cn/20210912202302819.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_19,color_FFFFFF,t_70,g_se,x_16)
看这个环境变量
![](https://img-blog.csdnimg.cn/20210912202408840.png)
bin加进来了 ,目录bin底下
![](https://img-blog.csdnimg.cn/20210912202600399.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210912202642316.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_17,color_FFFFFF,t_70,g_se,x_16)
补充:
![](https://img-blog.csdnimg.cn/20210912202723788.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
3、带个v的exec族函数
只不过把我们写的参数放到上面来
![](https://img-blog.csdnimg.cn/20210912203339564.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210912203348675.png)
运行的结果都是一样的只不过使用的方式不一样而已
如果用execv 呢?
v对比vp需要加个绝对路径
这是没加的 ![](https://img-blog.csdnimg.cn/20210912203957573.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
找不到文件
![](https://img-blog.csdnimg.cn/20210912203928632.png)
加完以后
![](https://img-blog.csdnimg.cn/20210912204235338.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210912204243663.png)
4、exec配合fork使用
![](https://img-blog.csdnimg.cn/20210913081543407.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913081358463.png)
先找到需要的内容 用grep
然后![](https://img-blog.csdnimg.cn/20210913081602766.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
把上面这个代码插入到下面
![](https://img-blog.csdnimg.cn/20210913081617607.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
粘贴文件
![](https://img-blog.csdnimg.cn/20210913082155213.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
太麻烦了,如果用exec族函数的话
复制的过程
![](https://img-blog.csdnimg.cn/20210913082534388.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
复制的过程
![](https://img-blog.csdnimg.cn/20210913082701861.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
代码如下
![](https://img-blog.csdnimg.cn/20210913083814697.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
这是开始的状态 ![](https://img-blog.csdnimg.cn/20210913083829749.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
这是运行完的结果
![](https://img-blog.csdnimg.cn/20210913083936792.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
5、system 函数
![](https://img-blog.csdnimg.cn/20210913090238957.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
linux system函数详解 - 南哥的天下 - 博客园
返回一个整型数,参数是一个char 型的指针(字符串)
执行一个shell 指令
![](https://img-blog.csdnimg.cn/20210913091203745.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
之前我们都习惯./11 执行这个文件
也可以sh -c ./11 执行这个文件
![](https://img-blog.csdnimg.cn/20210913092340121.png)
![](https://img-blog.csdnimg.cn/20210913092346644.png)
![](https://img-blog.csdnimg.cn/20210913092928621.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913092941879.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_14,color_FFFFFF,t_70,g_se,x_16)
再来弄一个
![](https://img-blog.csdnimg.cn/20210913093317908.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
原代码
![](https://img-blog.csdnimg.cn/2021091309333411.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
结果
![](https://img-blog.csdnimg.cn/20210913093448567.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_14,color_FFFFFF,t_70,g_se,x_16)
system 还会返回原程序中,执行后面的代码
如果我写错了呢?
![](https://img-blog.csdnimg.cn/2021091309370622.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913093713404.png)
6、popen函数
![](https://img-blog.csdnimg.cn/20210913101124986.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
linux下popen的使用心得_libinbin_1014的专栏-CSDN博客_linux popen
![](https://img-blog.csdnimg.cn/20210913103424371.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/2021091310344673.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_14,color_FFFFFF,t_70,g_se,x_16)
如果想要把他的值保存到文件,或者她运行的结果放到字符串里面,通过网络发出去,怎么办?
![](https://img-blog.csdnimg.cn/20210913103855328.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913103901578.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_12,color_FFFFFF,t_70,g_se,x_16)
数据都流失了
![](https://img-blog.csdnimg.cn/2021091310404283.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913104048150.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913104651907.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913104657600.png)
那么如何读取流中间的数据呢?
![](https://img-blog.csdnimg.cn/2021091310521668.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913105222828.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_15,color_FFFFFF,t_70,g_se,x_16)
如果我不把结果输出呢?
![](https://img-blog.csdnimg.cn/20210913105349765.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/20210913105356202.png)
什么都没输出
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)