系统编程-如何用fork函数创建指定数量个子进程?
fork函数:创建一个子进程。
pid_t fork(void);
失败返回-1
;
成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0
一般我们
if(pid == 0){
//子进程
}else if(pid > 0){
//父进程
//此时pid为子进程id
}
pid_t
类型表示进程ID,但为了表示-1
,它是有符号整型。(0不是有效进程ID,init
最小,为1
)
注意返回值,不是fork
函数能返回两个值,而是fork
后,fork函数变为两个,父子需各自返回一个。
创建3个子进程时我们自然会想到这样创建:
#include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid = 0;
for(int i = 0;i<3;i++){
pid_t pid = fork();
if(pid == 0){// child
printf("this is child-->res:%d,PID:%d,PPID:%d\n",pid,getpid(),getppid());
}else{
printf("this is father==>res/child's pid:%d,PID:%d,PPID:%d\n",pid,getpid(),getppid());
}
}
return 0;
}
运行结果:
执行后发现,创建了7个进程,显然这不是我们想要的。
为什么会创建7个进程呢?
因为每次循环开始的时候都会调用一次fork()函数,产生了如下分支:
如何解决呢?我们应该在子进程创建后break
跳出循环,这样子进程就不再调用fork()了,也就解决了问题:
#include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid = 0;
for(int i = 0;i<3;i++){
pid_t pid = fork();
if(pid == 0){// child
printf("this is child-->res:%d,PID:%d,PPID:%d\n",pid,getpid(),getppid());
break;//子进程跳出for循环,这样子进程就不再调用fork()了
}else{
printf("this is father==>res/child's pid:%d,PID:%d,PPID:%d\n",pid,getpid(),getppid());
}
}
return 0;
}
执行结果: