//
// 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 = ;
printf("The main process's ID is %d\n", getpid());
fpid = fork();
//1.fork:
//fork通过系统调用创建一个与原进程几乎完全相同的进程。但是,根据参数的不同,两个进程也可以完成不同的功能。
//一个进程调用fork后,系统会先给新进程分配资源,例如数据存储和代码空间。然后把原来的值都复制进去(不完全相同)
//fork调用一次返回两次:
printf("fpid : %d\n", fpid);
if(fpid < )//fpid < 0 :出现错误
printf("error in fork\n");
else if(fpid == ){// fpid == 0 :子进程返回 0
printf("Child process's id is %d\n", getpid());
printf("My parent process's id is %d\n", getppid());
count += ;
}else{// fpid > 0 :父进程返回新创建的子进程的 id
printf("Parent process's id is %d\n", getpid());
printf("My parent process's id is %d\n", getppid());
count += ;
}
//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 = ; i < ; i ++){
fpid = fork();
if(fpid == )
printf("child\n");
else if(fpid > )
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 ;
}

以下转自http://blog.csdn.net/jason314/article/details/5640969

另一份代码如下:

for(i=;i<;i++){
pid_t fpid=fork();//执行完毕,i=0,fpid=3225
if(fpid==)
printf("%d child %4d %4d %4d/n",i,getppid(),getpid(),fpid);
else
printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);
}

下图清晰看出,进程之间的关系:

Linux-fork()函数详解,附代码注释的更多相关文章

  1. fork函数详解(附代码)

    虽然篇幅很长,但大多是易懂的代码,不用担心看不完 这里的所有操作,都将在下面的代码中有所体现 fork会拷贝当前进程的内存,并创建一个新的进程.如上图,fork函数会将整个进程的内存镜像拷贝到新的内存 ...

  2. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  3. Linux环境fork()函数详解

    Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...

  4. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

  5. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  6. Linux C 中 fork() 函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  7. linux中fork函数详解(转)

    add by zhj: 在Linux,创建进程是用fork(),它其实就是拷贝父进程的数据段和其它数据,这相当于C函数调用中的值传递,这是 此后两者的修改都互不影响.因为两者的数据虽相同,但却在不同的 ...

  8. [fork]Linux中的fork函数详解

    ---------------------------------------------------------------------------------------------------- ...

  9. Linux中fork()函数详解(转)

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  10. 知识点查缺补漏贴02:Linux环境fork()函数详解

    引言 先来看一段代码吧, #include <sys/types.h> #include <unistd.h> #include <stdio.h> #includ ...

随机推荐

  1. 05 Python运算符

    Python运算符: 此图来源于菜鸟教程,更详细参考 http://www.runoob.com/python3/python3-basic-operators.html 说明: 同一优先级的通常从左 ...

  2. PatentTips – Shader Interfaces

    BACKGROUND Today's graphic processing units (GPUs) host all of the computations necessary to generat ...

  3. oracle 如何查看创建表等数据库对象时的DDL语句

    http://missyou4417.blog.163.com/blog/static/78905686201271041340284/ http://www.xifenfei.com/2012/05 ...

  4. 多Tabs的横向滚动插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持横向移动 2. 支持点击Tab后该Tab居中 3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小. 三. 使用说明 1. 在你的html中添加T ...

  5. ci 在阿里云访问的时候404

    最近想把ci 弄到阿里云去,结果发现,本地好好的,到了阿里云就404了.网上查了下 原来是 配置文件的问题. 配置文件就是 vhost下面的 **.conf文件  要有这个才行 location / ...

  6. TI C66x DSP 系统events及其应用 - 5.11(中断控制寄存器)

    C66x DSP运行中断的简要流程: 1.使能了全局中断和子中断.假设硬件检測到中断发生,那么CPU就要跳转. 2.软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP寄 ...

  7. Android SwipeToDismiss:左滑/右滑删除ListView条目Item

     <Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(githu ...

  8. 【JAVA】两点经纬度直线距离的计算

    来自谷歌地图的计算公式: 通过JAVA的Math类各种方法调用.实现上述公式 private static double EARTH_RADIUS = 6378.137;// 单位千米 /** * 角 ...

  9. objc_setAssociatedObject 1

    [Objective-C]关联(objc_setAssociatedObject.objc_getAssociatedObject.objc_removeAssociatedObjects) 标签:  ...

  10. MapReduce03

    ======================== MapReduce 2.0基本架构 ======================== Client -------------> 与MapRed ...