父进程与子进程
父进程创建子进程,两进程的关系(两种):
- 父子进程执行不同的代码段:父进程希望子进程继承自己的代码段并且拷贝数据段,继承打开的文件以及创建时的状态,然后父子进程执行不同的代码段。
- 创建一个全新进程:父进程希望在子进程当中执行另外一个可执行文件,从而达到创建一个全新进程的目的。
exec系列函数
exec函数在进程中是一系列函数,其作用是在进程中执行可执行文件。根据其不同的参数分为execl、execv、execp等函数。
exec系列函数可以替换当前进程(执行exec函数的进程)的正文段、数据段;初始化bbs段(存放未初始化的全局变量和静态变量的一块内存区域)为0值、初始化堆栈段(来源于加载的可执行)。
执行exec函数之后,当前的exec语句将会被替换成可执行文件的代码,判断条件中(一般都会为fork==0加上一个if条件)xec语句后的代码将不会被执行;exec系列函数执行成功不返回值,执行失败返回-1。
exec系列函数不创建新进程,而是在原来的进程(创建的子进程)空间内,修改用户数据段,而没有修改PCB。也就是说,创建的子进程就是为了执行可执行代码。
不同参数的exec函数
1. execl
代码示例
#include<stdio.h>
#include<unistd.h>
int main(){
printf("entering main process---\n");
if(fork()==0){
execl("/bin/ls","ls","-l",NNULL);
printf("exiting main process ----\n");
}
printf("back parent! ----\n");
return 0;
}
由这个代码运行的结果截图显示:在子进程的进程空间内,当执行execl之后,原先进程的后续代码段将会被忽略,所以printf("exiting main process ----\n");
会被忽略。
2. execv
代码示例
execv和execl的区别在于,execv把参数当作一个字符串数组传入。
3.execle
示例代码(可以以此指定一个新的环境变量表)