抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

函数族

族 : 一族就是一系列函数 相同或者相似的 如oop 函数重载

名字不同 但是实现的功能相似的

exec函数族介绍

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代.只留下进程ID 等一些表面上的信息仍保持原样,颇有些神似”三十六计”中的”金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回 -1,从原程序的调用点接着往下执行。

exec函数族作用图解

替换

image-20220408215949284

最后一条才是Linux函数库的 其他都是标准c库的

image-20220408223512584

execl

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*************************************************************************
> File Name: execl.c
> Author: 秃头王
> Mail: 1658339000@qq.com
> Created Time: 2022年04月10日 星期日 11时37分27秒
************************************************************************/

/* #include <unistd.h>
* int execl(const char *path, const char *arg, ...);
* - 参数:
* - path: 需要指定的执行的文件的路径或者名称
* a.out /test/高并发/Linux多线程/exec函数族/execl.aout
* 建议写绝对路径
* ./a.out hello world
* - arg: 是执行可执行文件所需要的参数列表
* 第一个参数一般没有什么作用, 为了方便, 一般可写的是执行的程序名称
* 从二个参数开始往后, 就是程序执行的所需要的参数列表
* 参数最后要以NULL结束(哨兵)
* - 返回值:
* 只有调用失败, 才会返回值, 返回-1, 并设置errno
* 如果调用成功没有返回值!
*
*/

#include <stdio.h>
#include <unistd.h>

int main() {

// 创建一个子进程, 在子进程中执行exec函数族中的函数
pid_t pid = fork();

if(pid > 0) {
// 父进程
printf("i am paren peocess, pid : %d\n", getpid());
sleep(1);
} else if(pid == 0) {
// 子进程

// 自己的可执行程序 --- 参数 可执行文件
// execl("test", "test", NULL);

// which ps --- /usr/bin/ps
// or
// execl("/usr/bin/ps", "ps", "a","u","x", NULL);
execl("/usr/bin/ps", "ps", "aux", NULL);

printf("i am child proess pid = %d\n", getpid());
}

for(int i = 0; i < 3; i++) {
printf(" i = %d, pid = %d\n", i, getpid());
}

return 0;
}

execlp

env // 环境变量

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*************************************************************************
> File Name: execl.c
> Author: 秃头王
> Mail: 1658339000@qq.com
> Created Time: 2022年04月10日 星期日 11时37分27秒
************************************************************************/

/* #include <unistd.h>
* int execl(const char *file, const char *arg, ...);
* - 会到环境变量中查找指定的可执行文件, 如果找到了就执行, 找不到就执行不成功。
* - 参数:
* - file: 需要执行的可执行文件的文件名
* - arg: 是执行可执行文件所需要的参数列表
* 第一个参数一般没有什么作用, 为了方便, 一般可写的是执行的程序名称
* 从二个参数开始往后, 就是程序执行的所需要的参数列表
* 参数最后要以NULL结束(哨兵)
* - 返回值:
* 只有调用失败, 才会返回值, 返回-1, 并设置errno
* 如果调用成功没有返回值!
*
*/

#include <stdio.h>
#include <unistd.h>

int main() {

// 创建一个子进程, 在子进程中执行exec函数族中的函数
pid_t pid = fork();

if(pid > 0) {
// 父进程
printf("i am paren peocess, pid : %d\n", getpid());
sleep(1);
} else if(pid == 0) {
// 子进程

// 自己的可执行程序 --- 参数 可执行文件
// execl("test", "test", NULL);

// which ps --- /usr/bin/ps
// or
// execl("/usr/bin/ps", "ps", "a","u","x", NULL);
execlp("ps", "ps", "aux", NULL);

printf("i am child proess pid = %d\n", getpid());
}

for(int i = 0; i < 3; i++) {
printf(" i = %d, pid = %d\n", i, getpid());
}

return 0;
}

execv

1
2
3
4
5
6
7
/*      int execv(const char *path, char *const argv[]);
* - argv: 是需要的参数的一个字符串数组
*
* // 使用 execv
* char *argv[] = {"ps", "aux", NULL};
* execv("/usr/bin/ps", argv);
*/

execve

1
2
3
4
5
6
/*
* int execve(const char *filename, char *const argv[], char *const envp[]);
* 先从指定环境变量中 查找 如果第一个查找不到就到第二个中查找 ...
* char *envp[] = {"/usr/bin", "/usr/bin/test", "xxxxx"};
*/

评论