Linux Fork
2.1程序一
2.1.1实验代码
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int value=5; //where?
int main(){
int i; //where?
pid_t pid;
for(i=0;i<2;i++){ // How many new processes and printfs?
pid=fork();
if(pid==0){
value += 15;
printf("Child: value = %d\n",value);
}
else if(pid>0){
wait(NULL);
printf("PARNET: value = %d\n",value);
exit(0); //Notice:What will happen with or without this line?
}
}
}
2.1.2代码理解
fork()函数会在运行时创建一个与自己完全相同的子进程,即父进程在进入第一次for循环后进行第一次fork创建。此时父进程pid > 0而子进程pid == 0- 父进程继续执行,并进行
wait(NULL)。wait意为:立即阻塞父进程,并进行判断:- 是否有当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,
wait就会收集这个子进程的信息,并把它彻底销毁后返回 - 如果没有找到这样一个子进程,
wait就会一直阻塞在这里,直到有一个出现为止(此时没有僵尸子进程,所以父进程阻塞等待)
- 是否有当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,
- 子进程并行执行,输出
Child: value = 20并进入下一个for循环 - 进入第二个
for循环后,原子进程变为新父进程,并创建与当前状态(i = 1)相同的子进程。子进程执行输出Child: value = 35并向下继续;新父进程进入wait阻塞 - 子进程运行结束,变为僵尸进程;新父进程结束阻塞,输出
PARNET: value = 20并向下运行,exit后运行结束;原父进程结束阻塞,输出PARNET: value = 5并exit,结束运行
考虑
value的生存期问题,在程序中作为全局变量,生存期一直到程序结束。对于每一个进程来说,value的值在进程创建时为自己进程固定,不再受到其他进程影响
fork函数用于创建子进程,同时返回 0 用于父进程与子进程的区分判断。
fork可能有三种不同的返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fork返回一个负值;所以在子进程创建自己的子进程时,它存储的
pid变量值已经变为新子进程的pid,不为 0,即为新父进程
若父进程没有
exit(0)则父进程会再次进入for循环,并创建子进程
2.1.3程序截图
- fork 程序

- 验证 fork 函数程序
