linux系统如何使用fork函数创建子进程
大家都知道linux是多进程的系统。可是,在linux中,进程是如何创建并运行的呢?
在linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程)。系统调用函数fork()是创建一个新进程的唯一方式,fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返回值。
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程。父进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程(父进程)的所有值都复制到新的新进程(子进程)中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
我们来看一个例子:
#include <unistd.h>
#include <stdio.h>int main ()
{pid_t fpid;fpid = fork();if (fpid < 0) {printf("error in fork!");} else if (fpid == 0) {printf("this is child process, pid %d/n",getpid());} else {printf("this is parent process, pid %d/n",getpid());}return 0;
}
运行结果是:
this is child process, pid 5574
this is parent process, pid 5573
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if (fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。
参考资料:
1、http://blog.csdn.net/jason314/article/details/5640969
2、http://blog.csdn.net/cywosp/article/details/27316803
linux系统如何使用fork函数创建子进程相关推荐
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
- fork()函数创建子进程
APUE–fork()函数介绍 文章目录 APUE--fork()函数介绍 一.fork()系统调用介绍 1.fork()创建子进程特点 2. 子进程的特点 二.代码示例 1.fork()创建子线程 ...
- Linux系统编程:fork函数的使用【循环创建N个子线程】
fork函数介绍 在linux下面进行系统编程,一定要养成一个好习惯,不懂的函数 直接 找男人,用man 指令进行查看,虽然是全英文 但是要强迫自己 学会看英文文档!下面是介绍,我们看重点. FORK ...
- 【Linux系统编程】fork() 函数详解
需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...
- fork函数创建子进程僵尸进程孤儿进程详讲
目录 1.创建子进程 1.1 fork() 1.2 fork()的返回值 1.3.fork的原理 1.4既然父子进程的代码是相同的,那么子进程是从哪行代码开始执行的? 1.5针对fork的返回值,让父 ...
- Linux系统【一】CPU+MMU+fork函数创建进程
切板中的内容输出到文件### 进程相关概念 程序:编译好的二进制文件,在磁盘上,不占用系统资源(不包括磁盘).(剧本) 进程:占用系统资源,是程序的一次运行.(戏剧) 一个程序可以产生多个进程,一个进 ...
- linux中fork函数及子进程父进程执行顺序
目录 一.fork入门知识 二.fork进阶知识 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以 ...
- 【Linux系统编程】vfork() 函数详解
00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...
- 理解进程、通过调用 fork 函数创建进程
文章目录 1.理解进程 1.1 CPU核的个数与进程数 1.2 进程 ID 2.通过调用 fork 函数创建进程 1.理解进程 进程(Process),其定义如下:"占用内存空间的正在运行的 ...
最新文章
- 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以
- 居然有人撸了一个网易云音乐云村,高手在民间!
- 63.死锁和死锁的原因
- Java入门算法(递归篇)丨蓄力计划
- 微服务架构案例(04):中间件集成,公共服务封装
- isalnum c语言函数
- 使用遗传算法解决N皇后问题
- AngularJS 讲解五, Factory ,Service , Provider
- ⭐图例结合超硬核讲解shiro⭐
- MySQL修改表字段的长度
- MySQL的自定义函数
- lte基站信号测试软件,LTE基站的RF一致性测试
- Android App开发实战之实现微信记账本(附源码 超详细必看)
- keras自然语言处理(四)
- 银联基于OpenStack 的“五高”生产金融云技术白皮书
- 雨听|在wps中将某一页ppt导出为图片
- 最新微信合成大西瓜小游戏(合成版)源码+附带流量主功能
- 图像处理 直方图均衡化
- java count sql_SQL优化之SELECT COUNT(*)
- 学生信息管理系统——顺序表
热门文章
- (一)Spring MVC简介
- PHP:第五章——字符串输出函数
- Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
- 成立仅8个月的个人网站,月收入几十万美金
- How ASP.NET MVC Works?
- POJ 2513 Colored Sticks
- 微型计算机及接口技术笔记,微机原理与接口技术笔记(一)
- 艾蔻扫地机器人怎么充电_扫地机器人锂电池的正确使用方法
- java第九章实验报告_2019JAVA第九次实验报告
- 国际智商测试皮肤软件,爆火的口服玻尿酸,是美容神器还是智商税?