大家都知道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函数创建子进程相关推荐

  1. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

  2. fork()函数创建子进程

    APUE–fork()函数介绍 文章目录 APUE--fork()函数介绍 一.fork()系统调用介绍 1.fork()创建子进程特点 2. 子进程的特点 二.代码示例 1.fork()创建子线程 ...

  3. Linux系统编程:fork函数的使用【循环创建N个子线程】

    fork函数介绍 在linux下面进行系统编程,一定要养成一个好习惯,不懂的函数 直接 找男人,用man 指令进行查看,虽然是全英文 但是要强迫自己 学会看英文文档!下面是介绍,我们看重点. FORK ...

  4. 【Linux系统编程】fork() 函数详解

    需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...

  5. fork函数创建子进程僵尸进程孤儿进程详讲

    目录 1.创建子进程 1.1 fork() 1.2 fork()的返回值 1.3.fork的原理 1.4既然父子进程的代码是相同的,那么子进程是从哪行代码开始执行的? 1.5针对fork的返回值,让父 ...

  6. Linux系统【一】CPU+MMU+fork函数创建进程

    切板中的内容输出到文件### 进程相关概念 程序:编译好的二进制文件,在磁盘上,不占用系统资源(不包括磁盘).(剧本) 进程:占用系统资源,是程序的一次运行.(戏剧) 一个程序可以产生多个进程,一个进 ...

  7. linux中fork函数及子进程父进程执行顺序

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

  8. 【Linux系统编程】vfork() 函数详解

    00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...

  9. 理解进程、通过调用 fork 函数创建进程

    文章目录 1.理解进程 1.1 CPU核的个数与进程数 1.2 进程 ID 2.通过调用 fork 函数创建进程 1.理解进程 进程(Process),其定义如下:"占用内存空间的正在运行的 ...

最新文章

  1. 组态王浏览器java_1工程浏览器是组态王的集成开发环境在这里可以
  2. 居然有人撸了一个网易云音乐云村,高手在民间!
  3. 63.死锁和死锁的原因
  4. Java入门算法(递归篇)丨蓄力计划
  5. 微服务架构案例(04):中间件集成,公共服务封装
  6. isalnum c语言函数
  7. 使用遗传算法解决N皇后问题
  8. AngularJS 讲解五, Factory ,Service , Provider
  9. ⭐图例结合超硬核讲解shiro⭐
  10. MySQL修改表字段的长度
  11. MySQL的自定义函数
  12. lte基站信号测试软件,LTE基站的RF一致性测试
  13. Android App开发实战之实现微信记账本(附源码 超详细必看)
  14. keras自然语言处理(四)
  15. 银联基于OpenStack 的“五高”生产金融云技术白皮书
  16. 雨听|在wps中将某一页ppt导出为图片
  17. 最新微信合成大西瓜小游戏(合成版)源码+附带流量主功能
  18. 图像处理 直方图均衡化
  19. java count sql_SQL优化之SELECT COUNT(*)
  20. 学生信息管理系统——顺序表

热门文章

  1. (一)Spring MVC简介
  2. PHP:第五章——字符串输出函数
  3. Udp广播的发送和接收(iOS + AsyncUdpSocket)下篇
  4. 成立仅8个月的个人网站,月收入几十万美金
  5. How ASP.NET MVC Works?
  6. POJ 2513 Colored Sticks
  7. 微型计算机及接口技术笔记,微机原理与接口技术笔记(一)
  8. 艾蔻扫地机器人怎么充电_扫地机器人锂电池的正确使用方法
  9. java第九章实验报告_2019JAVA第九次实验报告
  10. 国际智商测试皮肤软件,爆火的口服玻尿酸,是美容神器还是智商税?