-
execl
、execlp
、execle
:execl
:接受一个以NULL
结尾的参数列表,用于指定可执行文件的路径和命令行参数。execlp
:与execl
类似,但是它会在PATH
环境变量指定的目录中搜索可执行文件。execle
:在execl
的基础上,还允许传递环境变量数组。
-
execv
、execvp
、execvpe
:execv
:接受一个参数数组,用于指定可执行文件的路径和命令行参数。execvp
:与execv
类似,但是它会在PATH
环境变量指定的目录中搜索可执行文件。execvpe
:在execvp
的基础上,还允许传递环境变量数组。
-
execve
:- 接受一个参数数组和一个环境变量数组,用于指定可执行文件的路径、命令行参数和环境变量。
在这些函数执行成功后,当前进程的地址空间将被新程序的内容替代,而且这些函数不会返回。它们的返回值仅在执行失败时为-1,失败时进程将继续执行。
这种机制允许一个进程在不创建新的进程的情况下,用其他程序替代自己的内存空间,这对于实现一些特定的功能,比如在一个进程中执行另一个程序,是非常有用的。
一、execl
/*
#include <unistd.h>
int execl(const char *pathname, const char *arg, ...);
参数:
-path: 需要指定的可执行文件的路径
-arg: 第一个参数一般没有什么用,一般写可执行文件的名称
第二个参数开始,就是程序执行所需要的参数列表
参数最后需要以NULL结束(哨兵)
返回值:
只有当调用出错有返回值 -1
成功没有返回值
*/
#include "stdio.h"
#include "unistd.h"
int main(){
pid_t pid =fork();
if(pid>0){
printf("i am parent: %d \n",getpid());
} else if(pid==0){
//execl("hello","helko",NULL);
execl("bin/ps","ps","aux",NULL);
printf("i am a child: %d \n",getpid()); // 子进程不会执行
}
for (int i=0;i<3;i++){ // 子进程中不会执行
printf("%d.%d",i,getpid());
}
return 0;
}
二、execlp
/*
int execlp(const char *file, const char *arg, ...);
作用: 会在环境变量中查找指定的可执行文件,如果找到了就执行,找不到就不执行
参数:
-file: 需要指定的可执行文件的名称
-arg: 第一个参数一般没有什么用,一般写可执行文件的名称
第二个参数开始,就是程序执行所需要的参数列表
参数最后需要以NULL结束(哨兵)
返回值:
只有当调用出错有返回值 -1
成功没有返回值
*/
#include "stdio.h"
#include "unistd.h"
int main(){
pid_t pid =fork();
if(pid>0){
printf("i am parent: %d \n",getpid());
} else if(pid==0){
//execl("hello","helko",NULL);
execlp("ps","ps","aux",NULL);
perror("execlp");
printf("i am a child: %d \n",getpid()); // 子进程不会执行
}
for (int i=0;i<3;i++){ // 子进程中不会执行
printf("%d.%d",i,getpid());
}
return 0;
}