文章目录
一、进程的替换
exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
exec函数族,是由六个exec函数组成的。
1、exec函数族提供了六种在进程中启动另一个程序的方法。
2、exec函数族可以根据指定的文件名或目录名找到可执行文件。
3、调用exec函数的进程并不创建新的进程,故调用exec前后,进程的进程号并不会改变,其执行的程序完全由新的程序替换,而新程序则从其main函数开始执行。
exec函数族取代调用进程的数据段、代码段和堆栈段
一个进程调用exec后,除了进程ID,进程还保留了下列特征不变:
父进程号
进程组号
控制终端
根目录
当前工作目录
进程信号屏蔽集
未处理信号
二、exec函数族
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量。
execl函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execl(const char *path, const char *arg, ...);
int main(void)
{
printf("before execl\n");
//if(execl("./echoarg","echoarg","abc",NULL) == -1) ./为当前目录
//if(execl("/bin/ls","ls",NULL,NULL) == -1)
if(execl("/bin/ls","ls","-l",NULL) == -1)
{
printf("execl failed!\n");
perror("why"); //打印出打开失败的原因
}
printf("after execl\n");
return 0;
}
execlp函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//int execlp(const char *file, const char *arg, ...); 自己查找不用写路径即便当前路径下没有他也会取其他路径下查找
int main(void)
{
printf("this pro get system date\n");
if(execlp("ps","ps",NULL,NULL) == -1)
{
printf("execl failed!\n");
perror("why"); //打印出打开失败的原因
}
printf("after execl\n");
return 0;
}
execvp函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//v:如果是带v的函数,对应的命令或者程序是通过一个指针数组来传递的,指针数组的最后一个元素为NULL标识结束
int main(void)
{
printf("this pro get system date\n");
char *argv[]={"ps","-l",NULL};
if(execvp("ps",argv) == -1)
{
printf("execl failed!\n");
perror("why"); //打印出打开失败的原因
}
printf("after execl\n");
return 0;
}