exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。
exec函数族,是由六个exec函数组成的。
1、exec函数族提供了六种在进程中启动另一个程序的方法。
2、exec函数族可以根据指定的文件名或目录名找到可执行文件。
3、调用exec函数的进程并不创建新的进程,故调用exec前后,进程的进程号并不会改变,其执行的程序完全由新的程序替换,而新程序则从其main函数开始执行。
exec函数族取代调用进程的数据段、代码段和堆栈段
一个进程调用exec后,除了进程ID,进程还保留了下列特征不变: 父进程号 进程组号 控制终端 根目录 当前工作目录 进程信号屏蔽集 未处理信号
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量。
#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; }
#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; }
#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; }