1. 进程

1.1. 什么是进程

当可执行文件开始运行之后,就变为了系统中的一个进程,一个程序(可执行文件)运行起来之后可以创建多个进程执行,称之为多进程程序。

每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。

系统中所有的这些进程实体共享计算机系统的 CPU、外设、内存等资源。

1.2. 进程的状态

系统中的一个CPU在某一个时刻只能执行一个进程,系统中存在的这些多个进程按照一定的规则轮流交替执行,所以每个进程会产生不同的状态:

R:运行态或者就绪态,一旦等待CPU,立马执行;

S:可中断的睡眠状态(因为等待某种事件的发生而被挂起);

D:不可中断的睡眠状态(此时不能响应异步信号);

T:暂停状态;

W:退出状态,进程即将被销毁;

Z:退出状态,进程成为僵尸进程;

2. 编写多进程程序——创建子进程

2.1. 头文件

在使用多进程编程的API时,必须首先包含以下头文件:

#include //定义了fork函数

2.2. 创建进程

函数原型如下:

pid_t fork(void);

fork函数用来创建子进程,它是通过复制父进程得到的子进程,所以:

子进程将继承父进程的整个地址空间;

子进程只有pid号和父进程不一样;

fork函数会复制出子进程,接着子进程和父进程都处于就绪状态,开始由内核调度执行,所以,被调用的fork函数会返回两次:

父进程返回一次,返回的 pid_t 类型的值为新创建的子进程的pid;

子进程返回一次,返回的 pid_t 类型的值为0;

如果创建失败,父进程会返回-1。

另外,pid_t类型其实就是short类型。

2.3. 获取PID的函数

在头文件中定义,原型如下:

获取自己的pid

pid_t getpid(void);

在子进程中获取父进程的pid

pid_t getppid(void);

2.4. 创建子进程的示例代码

/**

* @brief 使用fork创建子进程示例程序

* @author Mculover666

* @note 创建一个子进程,打印父进程和子进程的pid,并测试n的值

*/

#include

#include

int main(void)

{

pid_t pid;

int n = 0; //测试父进程和子进程是否共享一个n

pid = fork();

if(pid < 0)

{

/* 创建子进程失败 */

printf("fork fail.\n");

return -1;

}

else if(pid == 0)

{

/* 子进程执行的程序 */

n += 1;

printf("I am child, my pid = %d, my father pid = %d, n = %d.\n", getpid(), getppid(), n);

return 0;

}

else

{

/* 父进程要执行的程序 */

n += 2;

printf("I am father, my pid = %d, my child pid = %d, n = %d.\n", getpid(), pid, n);

return 0;

}

}

编译:

gcc 02-fork_test.c -o 02-fork_test.o

执行:

由执行结果可以看到,n变量被子进程fork过去之后,在子进程中就有了一个新的变量n,所以父进程执行后n = 2,子进程执行后n = 1,不是同一个n。

2.5. 移植到嵌入式Linux开发板上运行测试

① 使用交叉编译工具重新编译程序:

arm-none-linux-gnueabi-gcc 02-fork_test.c -o 02-fork_test_arm.o

② 基于NFS文件系统,将可执行文件传到开发板上

cp 02-fork_test_arm.o /nfs_root/

③ 开发板上执行该程序测试,结果如下:

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

linux 创建子进程,Linux中使用fork创建子进程详解及示例程序相关推荐

  1. python迭代器创建序列_Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...

  2. linux的根文件系统中的proc文件夹详解

    什么是proc文件系统    |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...

  3. django批量修改table_python中Django视图(view)的详解(附示例)

    本篇文章给大家带来的内容是关于python中Django视图(view)的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一个视图函数(类),简称视图,是一个简单的Py ...

  4. linux在当前目录下创建pic目录,Linux中/proc目录下文件详解

    文章转自: Linux中/proc目录下文件详解(一) ------------------------------------------------------------------------ ...

  5. python程序启动其他python程序_python中使用fork创建新的进程

    python中如果要创建新进程的话,可以使用os模块中的fork方法.为了了解其中工作原理,笔者结合linux的查看进程ps命令,对这个方法做了一些测试. python运行时进程 python一开始运 ...

  6. python中使用fork创建新的进程

    fork知识入门 python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之间的执行是相互独立 ...

  7. 创建三个并发进程linux,Linux下几种并发服务器的实现模式(详解)

    1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循 ...

  8. linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...

    ln命令创建软链接的绝对路径和相对路径详解 简介 ln命令 总结 简介 Linux链接,可以分为硬链接与软链接:本文主要介绍软链接.(默认情况下,ln命令产生硬链接) 软链接文件类似于Windows的 ...

  9. linux基础配置脚本,Linux中selinux基础配置教程详解

    selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selin ...

最新文章

  1. Nature子刊:用机器学习揭露人类基因调控背后的“语法”
  2. 【阿里云课程】1小时快速掌握Caffe核心功能,完成完整的项目实践
  3. C语言 | 基于DS1302 的万年历实现
  4. 设置同时上内外网+文件共享
  5. 中国游戏行业观察报告
  6. 文档安全管理系统服务器地址是什么,一种文档安全管理系统登录方法及装置
  7. Android doc|Getting Started| Training部分 --翻译 Working with System Permissions
  8. 《算法图解》第二章笔记与课后练习_选择排序算法
  9. linux测试接口配置,linux can 总线socket接口测试使用
  10. 多语言样式容器内容超出父级宽度不换行显示
  11. MySQL中多表的连接
  12. 解决Linux下Questasim中代码字体非常小
  13. Verilog——格雷码和二进制码转换的Verilog实现
  14. SM3算法的编程实现
  15. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
  16. 对抗神经网络(Adversarial Nets)的介绍[1]
  17. C#向一个Word文件中插入文字与图片
  18. 小米4进入开发者模式
  19. 解决网页内容无法复制的方法
  20. 数字化转型|利用现代技术和通信手段|改变企业为客户创造价值的方式

热门文章

  1. 操作系统学习(第一章————第二章)
  2. FineReport之localhost拒绝了我们的连接请求
  3. (补充)微信长按识别二维码 -- 页面多个二维码如何识别?(二)
  4. 并行:四种C+OpenMP计算π的并行程序
  5. Power BI中的填充功能
  6. Java零基础个人学习路线总结
  7. sql按时间取去重最近_Sql去重语句
  8. 王者荣耀服务器维护到几点,今晚王者荣耀更新到几点 王者荣耀维护时间王者荣耀公告...
  9. java中如何输入字符
  10. 0-1整数规划的求解思路整理