-
进程替换?
父子进程之间是共享代码的,那么如果希望子进程去执行其它函数,而不是父进程的代码
完成这样的操作:需要使用到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
- 挨个介绍:
#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.上面介绍的函数均为在系统调用的基础上进行封装的