在使用fork()函数进行创建子线程的时候,如果没有在创建成功子进程时选择break跳出for循环,那么子进程也会进入for循环,开始调用fork()函数创建“孙子”进程,所以在创建子进程成功的时候就直接选择break跳出循环,使得if(pid == 0)为子进程的唯一出口,而父进程的唯一出口就是当for循环执行完毕后。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 int main(){
5 pid_t pid;
6 int i;
7 for(i = 1; i < 5; i++){
8 pid = fork();
9 if(pid == -1){
10 perror("fork创建进程失败!\n");
11 }else if(pid == 0){
12 //此处创建的是子进程,当遇到子进程的时候就跳出循环,免得再次循环执行fork()函数
13 break;//此处为子进程的唯一出口
14 }
15 }
16
17 //父进程的唯一出口为当循环执行结束后
18 if( i < 5){
19 sleep(i);
20 printf("我是第%d个子进程,我的父进程id为%u\n",i+1,getppid());
21 }else{
22 sleep(i);
23 printf("我是父进程,我的pid为%d\n",getpid());
24 }
25 }