fork()创建多个子进程
在学习linux中,老师布置了一个作业:
编写一段程序,使用系统调用fork)创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示"a";子进程分别显示字符"b“和字符"c"。试观察记录屏幕上的显示结果,并分析原因。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid1,pid2;
pid1=fork();
pid2=fork();
if(pid1<0||pid2<0){
perror("fork error");
}
if(pid1==0)
{
printf("pid1 = b\n");
}
else{
printf("father pid = a\n");
}
if(pid2==0){
printf("pid2 = c\n");
}
else
{
printf("father pid = a\n");
}
return 0;
}
每次结果都不一样!!!!!
尝试分析…
先设父进程为p100,创建的两个子进程为p101,p102
Pid1=fork(),首先创建一个子进程p101,该程序会继续执行父进程,pid2=fork(),此时创建了第二个子进程p102,此时fork()返回的为创建的pid1的进程号,进入if(pid1==0)的else,执行第一个“father pid = a”,然后再判断pid2,执行第二个 “father pid = a”。
此时父进程p100结束,进入子进程pid1(p101)。根据执行结果看,内核是先执行的pid2(应该是弹栈),那么pid2又做为父进程创建子进程,返回值为子进程pid3,所以有第三个“father pid = a”,然后执行pid2=fork();
pid1=fork();的返回值为0;接下来,pid1又会创建一个子进程pid3(p103)-----执行的是pid2=fork();这一步,
、、懵逼。。。
懵逼的原因就是子进程会再创建子进程,那么不再让子生子就好了↓↓↓↓↓↓↓
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t pid;
int i=0;
//父进程先创建子进程,fork()返回值为子进程的pid;然后进入子进程,此时fork()的返回值为0。然后i++,进入下一次循环,创建子进程。这样就没有子进程创建子进程了!!!
for (i=0;i<2;i++)
{
pid = fork();
if(pid==0){
break; //创建完子进程直接跳出循环,防止子生子
}
}
// i是全局变量
if(i==0){
printf("b\n");
}else if(i==1){
printf("c\n");
}else{
printf("a\n");
}
return 0;
}
执行结果正确!!!!!!!!!!!!!!