现在的位置: 首页 > 综合 > 正文

fork函数的真实义

2013年11月22日 ⁄ 综合 ⁄ 共 1300字 ⁄ 字号 评论关闭

 

        在多核开发应用中,多进程的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编程中,最难以理解的一个概念,很多网上的资料举的例子过于简单,解释也不详尽,所以不好理解。本例比较具体,大家看了如果还有不解的地方,欢迎交流。

抱歉!评论已关闭.