在多核开发应用中,多进程的fork应用很必然。下面看一个例子,从这个具体例子中,我将描述fork函数的真正意义。
int sum(int *data,int rank);//对rank对应的部分data进行sum操作,并把和的值返回。
#include<sys/types.h>
# include< unistd.h> # include< stdio.h> int main( int argc, char ** argv ) {int* data;
int rank;
int sum;
for( int i=0;i<10000;i++)
data[i]= i%256;
for( rank=1;i<10;i++)
{
int pid = fork();
if (pid < 0) { printf("error!"); } else if( pid == 0 ) { goto done;}else(printf(“this is father process,have finished creating %dth children process",rank);
}
}
rank = 0;
done:
printf( "the rank is %d,which means the %dth process is now runing here!\n", rank,rank);
sum = sum(data,rank);
printf("the sum of %dth rank is %d", rank,sum);
return 0;}
主函数代表着一个父进程在运行。调用fork函数创建子进程。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
fork的执行将有两次返回,这两次返回的值赋给pid。当pid小于0时,说明fork失败。当pid等于0时,说明这一次返回的是子进程。当pid返回的是一个大于0的值(代表进程号),说明这是父进程。
下面分解上述code的意思。当rank=1时,fork执行一次创建子进程1,子进程与父进程分道扬镳,跳出for循环体,跳到done继续执行。父进程则printf创建nth子进程完毕的信息,而后rank加1,继续执行for循环体,直到创建完9个子进程才结束循环,并赋予rank=0。
各个子进程,包括父进程,各走各的路,分别计算sum,并分别打印出来。因为不知道各个核对应的子进程的先后快慢次序,sum运算谁最先完成是不好控的。但这不影响多核多进程程序分工参与计算带来的性能的提高。
fork函数是linux编程中,最难以理解的一个概念,很多网上的资料举的例子过于简单,解释也不详尽,所以不好理解。本例比较具体,大家看了如果还有不解的地方,欢迎交流。