Linux进程之exec族函数

今天也学习了Linux进程的exec族函数(execl 和 execlp execv 和 execvp)
在这里也写一下自己的理解和总结。

一、作用:
可以在运行一个程序的时候,运行到一半的时候,或者运行到程序某个地方的时候,去运行另一个程序。

二、头文件:

 #include <unistd.h>

三、原型:

**1.execl**   int execl(const char *path, const char *arg, ...);
**2.execlp**  int execlp(const char *file, const char *arg, ...);
**3.execv**   int execv(const char *path, char *const argv[]);
**4.execvp**  int execvp(const char *file, char *const argv[]);

**5.execle**  int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
**6.execvpe** int execvpe(const char *file, char *const argv[],
                  char *const envp[]);         

四、参数
**path:**可执行文件的路径名字
**arg:**可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束。
**file:**如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。

五、返回值
exec函数族的函数执行成功后则不会返回,也不会从原程序中调用点下面的继续往下执行,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。

1. 先来使用第一个原型 execl

 int execl(const char *path, const char *arg, ...);

比如我想一开始先打印5、4、3、2、1、然后去运行 date 显示系统的时间。
我们直接在Linux中输入 date 回车 会显示出系统的时间。但是我们想在demo.c里面运行程序打印5.4.3.2.1后 再去运行date。所以我们用到execl。
首先我们得知道date 的路径
在这里插入图片描述
whereis + 对象 回车就能知道路径
date 路径是在/bin/date.

代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
注意:我们execl成功了之后是不会继续运行 下面的after execl。如果不成功才会执行下面的。

但是我们会发现每一次去运行另一个程序都需要用whereis 来查找路径。如果我们不写路径 直接写date 的结果如下:

在这里插入图片描述
运行结果:
在这里插入图片描述
很显然,我们的 execl 是没有找到的。

但是我们加一个 p 用另一个原型就可以做到。那就是 execlp

**2.execlp** int execlp(const char *file, const char *arg, ...);

代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
用execlp 就可以不用加绝对路径了。
比execl 多了一个p就能通过环境变量PATH查找到可执行文件date
PAYH是什么?
PATH是指环境变量,使用命令 echo P A T H 即 可 查 看 当 前 环 境 变 量 , 如 果 需 要 修 改 可 以 在 后 面 进 行 追 加 。 比 如 想 将 / e t c / a p a c h e 2 / b i n 添 加 为 环 境 变 量 , 可 写 为 : P A T H = PATH即可查看当前环境变量,如果需要修改可以在后面进行追加。比如想将/etc/apache2/bin添加为环境变量,可写为: PATH= PATH,/etc/apache2/bin,:PATH=PATH;/etc/apache2/bin 然后回车即可。
我们可以自己配置环境变量 用 export

当前环境变量:
在这里插入图片描述当前路径:

在这里插入图片描述
export 对两个进行拼接:
在这里插入图片描述
现在的环境变量:
在这里插入图片描述
拼接起来了。

运行程序不用./名字了 直接名字回车:
现在别的路径底下也能运行别的路径的可执行程序了。
在这里插入图片描述

**3.execv** int execv(const char *path, char *const argv[]);

其实这个跟上面的差不多的 就是把后面的参数包装了起来放在char*数组里面。
代码:
在这里插入图片描述
运行结果:
在这里插入图片描述

**4.execvp** int execvp(const char *file, char *const argv[]);

这个比上面的多了一个P 其实也还是可以不写绝对路径,

代码:
在这里插入图片描述
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47457689/article/details/107692424