linux 创建子进程,Linux中使用fork创建子进程详解及示例程序
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创建子进程详解及示例程序相关推荐
- python迭代器创建序列_Python 中迭代器与生成器实例详解
Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的 ...
- linux的根文件系统中的proc文件夹详解
什么是proc文件系统 |linux /proc目录介绍|proc中文手册 proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接 ...
- django批量修改table_python中Django视图(view)的详解(附示例)
本篇文章给大家带来的内容是关于python中Django视图(view)的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一个视图函数(类),简称视图,是一个简单的Py ...
- linux在当前目录下创建pic目录,Linux中/proc目录下文件详解
文章转自: Linux中/proc目录下文件详解(一) ------------------------------------------------------------------------ ...
- python程序启动其他python程序_python中使用fork创建新的进程
python中如果要创建新进程的话,可以使用os模块中的fork方法.为了了解其中工作原理,笔者结合linux的查看进程ps命令,对这个方法做了一些测试. python运行时进程 python一开始运 ...
- python中使用fork创建新的进程
fork知识入门 python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之间的执行是相互独立 ...
- 创建三个并发进程linux,Linux下几种并发服务器的实现模式(详解)
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循 ...
- linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...
ln命令创建软链接的绝对路径和相对路径详解 简介 ln命令 总结 简介 Linux链接,可以分为硬链接与软链接:本文主要介绍软链接.(默认情况下,ln命令产生硬链接) 软链接文件类似于Windows的 ...
- linux基础配置脚本,Linux中selinux基础配置教程详解
selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selin ...
最新文章
- Nature子刊:用机器学习揭露人类基因调控背后的“语法”
- 【阿里云课程】1小时快速掌握Caffe核心功能,完成完整的项目实践
- C语言 | 基于DS1302 的万年历实现
- 设置同时上内外网+文件共享
- 中国游戏行业观察报告
- 文档安全管理系统服务器地址是什么,一种文档安全管理系统登录方法及装置
- Android doc|Getting Started| Training部分 --翻译 Working with System Permissions
- 《算法图解》第二章笔记与课后练习_选择排序算法
- linux测试接口配置,linux can 总线socket接口测试使用
- 多语言样式容器内容超出父级宽度不换行显示
- MySQL中多表的连接
- 解决Linux下Questasim中代码字体非常小
- Verilog——格雷码和二进制码转换的Verilog实现
- SM3算法的编程实现
- NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
- 对抗神经网络(Adversarial Nets)的介绍[1]
- C#向一个Word文件中插入文字与图片
- 小米4进入开发者模式
- 解决网页内容无法复制的方法
- 数字化转型|利用现代技术和通信手段|改变企业为客户创造价值的方式