Fork函数详解
Fork函数主要是用于子进程的建立,在c的#include<unistd.h>中。下面以一个程序为例子说明fork函数的简单应用。
/*
* fork.c
*
* Created on: 2014-12-2
* Author: Administrator
*/
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(int argc, char *argv[]) {
printf("getpid:%d--------------\n",getpid());
pid_t pid=0;
pid=fork();
if(pid<0)
{
printf("opps,create fork error\n");
}
else if (pid ==0)
{
printf("yeah,i am son\n");
printf("son,pid:%d\n",getpid());
printf("in son getppid() :%d\n",getppid());
int i=0;
int sum =0;
for(i;i<1000;i++)
{
sum+=i;
}
printf("sum=%d\n",sum);
}
else
{
printf("i am dad\n");
printf("ret_id:%d\n",pid);
printf("father:pid:%d\n",getpid());
printf("in father getppid() :%d\n",getppid());
}
return 0;
}
printf("getpid:%d--------------\n",getpid());
此句话为了打印main函数所开的进程的进程id,getpid()函数可获得当天进程的id,同时返回进程id号
pid=fork();
fork()是分出一个子进程,进程在出现fork的时候,就开始复制主进程的一个副本,注意这里的复制时从fork开始,所以上一句printf是只会打印一次。Fork返回三个值就是负数,0,以及正数。如果是负数表明因为某种原因没办法创建子进程,0当天正在执行后面的代码的进程是子进程,因为fork如果创建了子进程这里的返回值就是子进程号,这里是0所以没有子进程的号,索命此时进程就是子进程。所以正数也很容易理解,就是说明后面的就是父进程在执行后面的代码段。如果创建成功的话,会执行两次分别是0的父进程以及非0的子进程。
else if (pid ==0)
通过pid==0可以判定子进程的时候就要进入if,在getpid和getppid,分别得出的应该是当天子进程的ID(这个可以再进入主进程的时候验证)和父进程的ID也就是第一句printf的ID。
Else
表明此时是父进程在使用CPU的时间片,在这里有几个打印语句来验证
printf("i am dad\n");
表明我进入了父进程
printf("ret_id:%d\n",pid);
printf("father:pid:%d\n",getpid());
printf("in father getppid() :%d\n",getppid());
第一句为了验证fork是否返回的是子进程号可以与上面的子进程的ID做对比
第二句获取主进程的ID,校验是否一致
第三句是主进程的父进程是啥,我返回的是1不知道啥意思。现在知道了,1是系统的init进程所以理论来说所有的应用程序的父进程就是ID=1的init进程
这是我的结果:
getpid:11624--------------
yeah,i am son
son,pid:11688
in songetppid() :11624
sum=499500
getpid:11624--------------
i amdad
ret_id:11688
father:pid:11624
in fathergetppid() :1
这是fork的简单实用,但是如果我使用一个for循环来建立多个子进程,此时会出现多少个子进程呢,以及他们对应的意思?