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 ...
随机推荐
- 【Codeforces 364A】Matrix
[链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...
- Intellij IDEA神器居然还有这些小技巧---超级好用的
Intellij IDEA神器居然还有这些小技巧----https://my.oschina.net/samgege/blog/1808622?p=8
- HDU 1540 区间合并线段树
题目大意: 就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置 #include <cstdio> #include <cstring> #include &l ...
- nyoj_278_排队_201403282135
排队 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 周末了,软件ACM的队员准备玩玩游戏,娱乐一下,CY想了一个好主意,所有队员站成一个圈,从1开始报数,凡是报出指 ...
- [bzoj5301][Cqoi2018]异或序列_莫队
异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...
- 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。
在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...
- update city_demo set city=(select city from city order by rand() limit1);
update city_demo set city=(select city from city order by rand() limit1); 因为使用了rand()函数,所以每一次查询的结果是不 ...
- 新博客有了,文章转移到 http://www.iosxxx.com/
文章转移到 http://www.iosxxx.com/ ,敬请大家关注
- Android首次启动时间长优化之预编译提取Odex
提示!应用程序的安装有两种情况,第一:首次启动系统时安装.第二:系统启动完毕后安装. 本篇博文基于第一种安装场景.在系统首次启动的场景中,系统会对/system/app./system/pri ...
- MCU低功耗设计(三)产品
关键词: 低功耗设计, 无线通信产品, LoRa长距离, Contiki系统, 能耗实时跟踪 引言: 能耗对电池供电的产品来说是一个重大问题.一旦电能耗尽设备将"罢工".在< ...