标签:
// // main.c // Project_C // // Created by LiJinxu on 16/8/13. // Copyright © 2016年 LiJinxu-NEU. All rights reserved. // #include <stdio.h> int main(int argc, const char * argv[]) { pid_t fpid; /* Test Fork Part 1*/ int count = 0; printf("The main process‘s ID is %d\n", getpid()); fpid = fork(); //1.fork: //fork通过系统调用创建一个与原进程几乎完全相同的进程。但是,根据参数的不同,两个进程也可以完成不同的功能。 //一个进程调用fork后,系统会先给新进程分配资源,例如数据存储和代码空间。然后把原来的值都复制进去(不完全相同) //fork调用一次返回两次: printf("fpid : %d\n", fpid); if(fpid < 0)//fpid < 0 :出现错误 printf("error in fork\n"); else if(fpid == 0){// fpid == 0 :子进程返回 0 printf("Child process‘s id is %d\n", getpid()); printf("My parent process‘s id is %d\n", getppid()); count += 1; }else{// fpid > 0 :父进程返回新创建的子进程的 id printf("Parent process‘s id is %d\n", getpid()); printf("My parent process‘s id is %d\n", getppid()); count += 100; } //2.fpid:其实进程间的关系,就像一个链表一样。父进程返回的是指向的子进程的id, 子进程后面没有进程返回0。 //3.getpid: 每个进程都有一个独特的(互不相同的)进程表示符(process ID),可以通过getpid()获得。 //3.1.getppid: 获得父进程的pid。 //4.执行顺序:没有固定的执行顺序,先后顺序根据系统的进程调度策略。 //5.执行结果的解释: 4868 -> 4867(par)(Main)-> 4870(child) -> 0. //当打印输出的时候,发现在子进程中打印其父进程的pid = 1(由之前的结果可知:应该是4867)。这是因为父进程(main进程)执行完后已经退出了, 子进程的父进程就被置成了p1,p1永远不会死亡, printf("Count = %d\n", count); /* Test Fork Part 2*/ for(int i = 0 ; i < 3; i ++){ fpid = fork(); if(fpid == 0) printf("child\n"); else if(fpid > 0) printf("father\n"); else{ printf("error\n"); } } /* i = 0 , 1 , 2 father father father son son father son son father father son son father son 总结一下规律,对于这种N次循环的情况,执行printf函数的次数为2*(1+2+4+……+2N-1)次,创建的子进程数为1+2+4+……+2N-1个。 */ return 0; }
以下转自http://blog.csdn.net/jason314/article/details/5640969
另一份代码如下:
for(i=0;i<2;i++){ pid_t fpid=fork();//执行完毕,i=0,fpid=3225 if(fpid==0) printf("%d child %4d %4d %4d/n",i,getppid(),getpid(),fpid); else printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid); }
下图清晰看出,进程之间的关系:
标签:
原文地址:http://www.cnblogs.com/luntai/p/5769886.html