Linux系统编程 -- exec函数族

  1. 进程替换?

    父子进程之间是共享代码的,那么如果希望子进程去执行其它函数,而不是父进程的代码
    完成这样的操作:需要使用到exec函数族,去执行另外一个程序,进程调用exec函数时,进程的

用户空间代码和数据会完全被新的程序代替,这并没有去创建新的进程,而是代码段和数据段的替换

2.函数如下:

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[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

其中: l:list | p:path | e:env

  1. 挨个介绍:

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

//01.int execl(const char *path, const char *arg, ...);
int main(){
    printf("替换函数之前\n");
    execl("/bin/ls","ls","-a","-l",NULL);
    printf("替换函数之后\n");
    return 0;
}

替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:17 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 10920 May  4 01:17 exec
-rw-rw-r--  1 ubuntu ubuntu   254 May  4 01:17 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile
可以看到后面那个printf并没有打印出来,是因为替换了新的代码段,所以执行不到

而且是没有返回值的,一旦失败就不去执行了



//04 int execv(const char *path, char *const argv[]);
int main(){
    printf("替换函数之前\n");
    char *argv[] = {"ls","-a","-l",NULL};
    execv("/bin/ls",argv);
    printf("替换函数之后\n");
    return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec 
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:24 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 11024 May  4 01:24 exec
-rw-rw-r--  1 ubuntu ubuntu   653 May  4 01:24 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile


//05 int execvp(const char *file, char *const argv[]);
int main(){
    printf("替换函数之前\n");
    char *argv[] = {"ls","-a","-l",NULL};
    execvp("ls",argv);
    printf("替换函数之后\n");
    return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec 
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:25 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 11024 May  4 01:25 exec
-rw-rw-r--  1 ubuntu ubuntu   652 May  4 01:25 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile


//02 int execlp(const char *file, const char *arg, ...);
int main(){
    printf("替换函数之前\n");
    execlp("ls","ls","-a","-l",NULL);
    printf("替换函数之后\n");
    return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec 
替换函数之前
total 44
drwxrwxr-x  2 ubuntu ubuntu  4096 May  4 01:27 .
drwxrwxr-x 11 ubuntu ubuntu  4096 May  4 00:44 ..
-rwxrwxr-x  1 ubuntu ubuntu 10920 May  4 01:27 exec
-rw-rw-r--  1 ubuntu ubuntu   628 May  4 01:27 exec.c
-rwxrwxr-x  1 ubuntu ubuntu 11032 May  4 00:50 exit
-rw-r--r--  1 ubuntu ubuntu   170 May  4 00:50 exit.c
-rw-r--r--  1 ubuntu ubuntu   225 May  4 00:17 makefile


//替换一个自己实现的函数
//int execl(const char *path, const char *arg, ...);
int main(){
    printf("替换函数之前\n");
    execl("./exe","exe",NULL);
    printf("替换函数之后\n");
    return 0;
}
ubuntu@VM-0-17-ubuntu:~/linuxTest/sys_linux/csdn$ ./exec 
替换函数之前
exec replace
exec replace
exec replace


//自己组装环境变量传递到替换后的代码中
#include<stdio.h>
#include<unistd.h>

//03 int execle(const char *path, const char *arg, ...,char *const envp[]);
int main(){
    printf("替换函数之前\n");
    char * newenv[] = {"newenv=this_is_new",NULL};
    execle("./exe","exe",NULL,newenv);
    printf("替换函数之后\n");
    return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){

    while(1){
        printf("exec replace\n");
        sleep(2);
        printf("newenv:%s\n",getenv("newenv"));
    }
    return 0;
}

4.上面介绍的函数均为在系统调用的基础上进行封装的
在这里插入图片描述

​​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值