Linux之exec族函数

一直以来都不怎么清楚exec函数族,现在就来总结一下

1
2
3
4
5
6
7
8
9
10
#include <unistd.h>
//execl系列
int execl(const char *path, const char *arg, ...)
int execlp(const char *file, const char *arg, ...)
int execle(const char *path, const char *arg, ..., char *const envp[])

//execv系列
int execv(const char *path, char *const argv[])
int execve(const char *path, char *const argv[], char *const envp[])
int execvp(const char *file, char *const argv[])

描述

exec()系列函数使用新的进程映像替换当前进程映像,工作方式没有什么差别, 只是参数传递的方式不同罢了.

说明

这6个函数可分为两大类: execl()系列 和 execv()系列.

  • ‘l’ 是指把所有传递给程序的参数依次列(list)出来.

  • ‘v’ 是指把所有参数放到容器(数组, vector)中再一次性传入.

  • 不论是list出来还是vector them all, 参数的最后一个都必须为空指针((char*)0都行).

  • 没有以p/e结尾的execl()和execv()使用绝对路径(path)执行第1个参数给定的文件.

  • ‘p’ 是指第1个参数位于默认的环境变量PATH中, 仅用文件(file)指出文件名即可.

  • ‘e’ 是指第1个参数位于给定的envp环境变量中., 用绝对路径(path)给出待执行文件.

  • 注意arg0: 应该始终为待执行文件的文件名

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <unistd.h>

int main(void)
{
char* const argv[] = {"ps", "ax", 0};
char* const envp[] = {"PATH=/bin:/usr/bin", 0};
int i = 0;

scanf("%d",&i);

switch(i) {
case 1:
execl("/bin/ps", "ps", "ax", NULL);
case 2:
execlp("ps", "ps", "ax", NULL);
case 3:
execle("/bin/ps", "ps", "ax", NULL, envp);

case 4:
execv("/bin/ps", argv);
case 5:
execvp("ps", argv);
case 6:
execve("/bin/ps", argv, envp);
}
return 0;
}