Linux-fork()函数详解,附代码注释
//
// 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()函数详解,附代码注释的更多相关文章
- fork函数详解(附代码)
虽然篇幅很长,但大多是易懂的代码,不用担心看不完 这里的所有操作,都将在下面的代码中有所体现 fork会拷贝当前进程的内存,并创建一个新的进程.如上图,fork函数会将整个进程的内存镜像拷贝到新的内存 ...
- 【转】linux 中fork()函数详解
在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...
- Linux环境fork()函数详解
Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...
- linux select函数详解
linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...
- Linux中fork()函数详解(转载)
linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...
- Linux C 中 fork() 函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- linux中fork函数详解(转)
add by zhj: 在Linux,创建进程是用fork(),它其实就是拷贝父进程的数据段和其它数据,这相当于C函数调用中的值传递,这是 此后两者的修改都互不影响.因为两者的数据虽相同,但却在不同的 ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- Linux中fork()函数详解(转)
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- 知识点查缺补漏贴02:Linux环境fork()函数详解
引言 先来看一段代码吧, #include <sys/types.h> #include <unistd.h> #include <stdio.h> #includ ...
随机推荐
- linux动态库加载路径修改
1.在 /etc/ld.so.conf 文件中添加搜索路径,重启或者 ldconfig 生效: 2.在 /etc/ld.so.conf.d 目录下添加 *.conf 文件,其中可以添加搜索路径,重启获 ...
- mysql 查询当天、本周,本月,上一个月的数据---https://www.cnblogs.com/benefitworld/p/5832897.html
mysql 查询当天.本周,本月,上一个月的数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM ...
- [K/3Cloud]K3Cloud的移动审批方面
基于最新的K3Cloud2的SP2,当前K3Cloud上所有的工作流都可以在移动手机上进行移动审批,具体如下: K/3 Cloud 支持移动审批,支持安卓和IOS. 关于申请试用: 1.打开浏览器,进 ...
- spring-boot | 整合通用Mabatis 分页插件PageHelper
Mybatis通用Mapper介绍 Mybatis 通用 Mapper 极其方便的使用 Mybatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询 优点: 通用 Mapper 可以极大的方 ...
- Tyvj1139 向远方奔跑(APIO 2009 抢掠计划)
描述 在唐山一中,吃饭是一件很令人头疼的事情,因为你不可能每次都站在队伍前面买饭,所以,你最需要做的一件事就是——跑饭.而跑饭的道路是无比艰难的,因为路是单向的(你要非说成是双向的我也没法,前 ...
- J2EE 课件3 JSP标记
•JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记 1.指令标记page page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单 ...
- vijos——1164 曹冲养猪
描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把.举个例子,假如有16 ...
- Linux 安装 RabbitMQ
转载文章,地址:https://www.cnblogs.com/uptothesky/p/6094357.html 侵删!
- Ubuntu 16.04安装VMware-Workstation-12
1.下载: https://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-12.1.1-3770994.x86_64. ...
- dubbo bug之 Please check registry access list (whitelist/blacklist)的分析与解决
1.基本就是dubbo provider没有启动会造成这种情况. 2.api和service是同一个项目,并不是俩项目. 通过启动api,run on server是不能启动service的,必须通过 ...