一、execve介绍
exec系列函数可以在同一个进程跳转执行另一个程序,如execve
二、execve的函数原型和参数介绍
int execve (const char * path, char *const argv[], char *constenvp[])
一共有三个参数
1. const char * path :要传入执行的路径
2.char *const argv[]:这个参数有三个参数
(1)执行的路径
(2)执行程序要传入的参数(argv[1](argv[0]代表可执行文件本身,所以这里的参数下标为1)在这里,也可以事先定义好字符串传入)
(3)NULL
3.char *constenvp[]:两个参数
(1)环境变量
(2)NULL
return:成功不返回(因为这是跳转函数,成功后,下面的代码无意义),相反返回-1
三、用法
这里举的例子是尚硅谷班长上二楼的例子
pid_t pid = fork(); //fork会复制父进程的所有资源
if(pid < 0)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid == 0)
{
//子进程代码
strcpy(buffer,"fork's son\r\n");
char *name = "banzhang";
char *args[] = {"/work/fork/erlou", name, NULL};
char *envs[] = {NULL};
int re = execve(args[0], args, envs);
if(re == -1)
{
printf("%s up st failed\n", name);
}
//上楼成功不再执行子进程以下程序
}
else
{
//父进程代码
sleep(1);
strcpy(buffer,"fork\r\n");
printf("old %d after invent %d learn continue\r\n", getpid(), pid);
}
使用fork()新建子进程之后,若创建成功,不进行跳转execve的话,其父子进程都是在此文件内运行的,借用execve函数,将子程序跳转到另一个文件中运行(形象比喻成班主任和班长在一楼,班长因为execve上了二楼)
注意此处几个地方:
1. char *args[] = {"/work/fork/erlou", name, NULL};是指针数组,第一个元素代表要跳转文件的路径(此处的erlou就是gcc -o生成的可执行文件)
2. char *envs[] = {NULL};此处环境变量可以填NULL,因为此时路径就已经在其环境中
3. int re = execve(args[0], args, envs);根据前文中提到的参数介绍,此处第一个参数是args指针数组的第一个元素,即路径字符串,而第二个参数是数组args(包含所有参数),第三个参数测试envs(注意此时在char *args[]中的第二个参数,我们没使用argv[1],而是直接使用自己赋值的字符串char *name)
4.返回-1则表示跳转失败,否则表示成功,跳转成功后子进程跳转以下的函数将不再执行。
这是本篇所有内容,谢谢阅读!