废话不多说,先上代码
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t pid;
int i;
for(i = 0; i < 3; i++){
pid = fork();
if(0 == pid || -1 == pid){
break;
}
}
if(0 < pid){
printf("我是父进程,进程id号:%d\n",getpid());
return 0;
}
if(0 == pid){
printf("我是子进程,进程id号:%d,所属父进程:%d\n",getpid(),getppid());
return 0;
}
if(-1 == pid){
printf("进程创建失败\n");
return 0;
}
return 0;
}
输出结果:
我是子进程,进程id号:1249,所属父进程:1248
我是子进程,进程id号:1250,所属父进程:1248
我是父进程,进程id号:1248
我是子进程,进程id号:1251,所属父进程:1248
一开始初学看这段代码的时候,我是很不解的,原因是下面的代码:
for(i = 0; i < 3; i++){
pid = fork();
if(0 == pid || -1 == pid){
break;
}
}
pid的返回有三个值,0表示子进程,大于0表示父进程,-1表示进程创建失败,按代码逻辑看的话不就是执行了一次然后通过break停止循环了吗?这样怎么创建多个进程呢?
unix环境高级编程关于fork是这样说的,fork函数调用一次,返回两个值,这两个值有两种情况,分别是pid = 0,pid > 0和pid > 0和pid = -1.当fork完成后,子进程和父进程继续执行fork后面的指令,子进程是父进程的副本,子进程获得父进程数据空间,堆和栈的副本。
从上面的话我们得知,当执行fork的时候,系统将程序分裂成两个进程,两个进程运行状态独立了,子进程和父进程的执行位置是用一样的,换句话说子进程和父进程的执行位置就是pid = fork();,正在等待系统返回pid的值。从父进程的角度,pid > 0 ,此时不满足if条件,从而会继续循环。子进程的pid = 0;满足if语句的条件,跳出循环,执行循环外的if语句,子进程不会继续创建进程。从而满足一个父进程,多个子进程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。