函数族
族 : 一族就是一系列函数 相同或者相似的 如oop 函数重载
名字不同 但是实现的功能相似的
exec函数族介绍
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。
exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代.只留下进程ID 等一些表面上的信息仍保持原样,颇有些神似”三十六计”中的”金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回 -1,从原程序的调用点接着往下执行。
exec函数族作用图解
替换

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

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
|
#include <stdio.h> #include <unistd.h>
int main() {
pid_t pid = fork();
if(pid > 0) { printf("i am paren peocess, pid : %d\n", getpid()); sleep(1); } else if(pid == 0) {
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
|
#include <stdio.h> #include <unistd.h>
int main() {
pid_t pid = fork();
if(pid > 0) { printf("i am paren peocess, pid : %d\n", getpid()); sleep(1); } else if(pid == 0) {
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
execve