Linux下创建进程简介
在博文https://blog.csdn.net/fengbingchun/article/details/108940548中简单介绍了Windows下通过函数CreateProcess创建进程的过程,这里简单介绍下Linux下通过fork函数创建进程的过程。很早之前在https://blog.csdn.net/fengbingchun/article/details/45690745中也曾介绍过。
进程创建的UNIX模型为分叉----执行(fork----exec)模型。fork函数调用生成一个完全复制父进程内存的子进程。exec函数调用以一个新的可执行文件替换当前进程。这两个调用通常一起使用,这样应用程序可调用fork函数创建一个新进程,然后该子进程直接调用exec函数以一个新的可执行文件替换自身。如果fork调用后面不跟exec调用,我们将有同一进程的两个副本。到进行分叉调用时这两个进程的进程状态是一样的。
子进程和父进程都会从fork函数调用返回,唯一的区别在于调用的返回值。子进程将返回零值,父进程将返回子进程的进程ID。fork函数不带任何参数,并返回一个整数值,返回负值,表示创建子进程失败。子进程和父进程在单独的内存空间中运行。子进程具有自己唯一的进程ID。子进程不会继承其父进程的内存锁。调用一次fork,却能够返回两次返回值,在子进程中,fork函数返回0,在父进程中,fork函数返回新创建子进程的进程ID。我们可以通过fork返回值来判断当前进程是子进程还是父进程。两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调动策略。一个进程通过调用wait来与它的子进程同步。
以下是测试代码段:
void test_fork_1()
{// reference: https://www.geeksforgeeks.org/fork-system-call/fork();fork();fork();// "hello"的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目fprintf(stdout, "hello\n"); // 注:总共会输出8次hello
}
test_fork_1():总共会输出8次”hello”。”hello”的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目。8次”hello”=1个主进程+7个子进程。执行结果如下图所示:
void test_fork_2()
{// reference: https://www.geeksforgeeks.org/fork-system-call/pid_t f = fork();// child process because return value zeroif (f == 0) {fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());}// parent process because return value non-zeroelse if (f > 0) {fprintf(stdout, "hello from parent: my(parent) pid: %d\n", getpid());} else {fprintf(stderr, "unable to create child process\n");}
}
test_fork_2():”hello from child”和”hello from parent”两个输出是可能的,因为父进程和子进程同时运行。因此,我们不知道操作系统是先将控制权交给父进程还是子进程。父进程和子进程正在运行同一程序,但这并不意味着它们是相同的。操作系统为这两个进程分配不同的数据和状态,并且这些进程的控制流可以不同。执行结果如下图所示:
GitHub:https://github.com/fengbingchun/Messy_Test
Linux下创建进程简介相关推荐
- Windows下创建进程简介
正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...
- java 创建进程_Linux下创建进程简介
进程创建的UNIX模型为分叉----执行(fork----exec)模型.fork函数调用生成一个完全复制父进程内存的子进程.exec函数调用以一个新的可执行文件替换当前进程.这两个调用通常一起使用, ...
- linux下多进程编程简介
两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...
- linux下创建svn仓库及用户
1 Linux下创建svn仓库 1.1 启动SVN服务 svnserve -d -r /SVNRootDirectry 其中SVNRootDirectry是你的SVN 根目录,例如192.85.1. ...
- linux下查看进程的线程数,linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- 查看linux进程的设备io,Linux下查看进程IO工具iopp
Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...
- Linux创建进程必须fork么,Linux - fork() 创建进程
Linux - fork() 创建进程 Linux - fork() 创建进程 介绍创建进程之前,先简单地介绍一下 Linux 下的进程内存布局. Stack - 所有函数的 local variab ...
- 【Linux】从冯诺依曼体系到初识Linux下的进程
目录 前言 1.冯诺依曼体系结构 2.管理和操作系统 3.初识进程 1.描述进程PCB(process control block) 1.标识符pid fork接口创建子进程 2.进程状态 3.进程优 ...
- linux sftp创建多用户,Linux 下创建 sftp 用户并限定目录
Linux 下创建 sftp 用户并限定目录 1.创建 sftpUser 用户组 [root@XXX ~]# groupadd sftpUser 2.创建 sftpUser 用户并指定目录 [root ...
最新文章
- hdu4126(MST + 树形dp
- Shopify 英文(多国语言)国际网店 注册指南
- 垃圾分类:人机搭配,干活不累
- 安装Selenium
- R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
- Elasticsearch Index Template(索引模板)
- 辅助功能性代码,研究和记录代码。
- FormsAuthentication使用指南
- 乐高spike python_SPIKE Prime科创套装 篇四:乐高教育SPIKE Prime入门编程和搭建活动教学...
- 数据挖掘 应用案例集
- spring手动控制事务开启_手动控制spring事务
- 熊猫阿波的故事 2201
- python基础教程: for 循环用法
- 计算长方形或正方形的周长和面积
- python爬虫小实例
- VS2015企业版,社区版,专业版详细对比
- HashMap的链表结构
- Excel数据如何导入到Oracle数据库中
- 计算机网络和因特网大二暑假
- 湖南工业大学电费数据抓取(完美校园版)
热门文章
- Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了
- OpenCV-Python官方文档学习笔记(上)
- 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码
- 【Pandas库】(6) 索引操作--改、查、高级索引
- 腐蚀rust电脑分辨率调多少_腐蚀Rust怎么设置画面 腐蚀Rust提高帧数画面设置方法...
- PCL中outofcore模块---基于核外八叉树的大规模点云的显示
- Qt中openGL的四个重要事件(initializeGL() resizeGL() paintGL() pdateGL())调用规则
- 根据keyName(如:result.data.name),无限深度遍历获取keyValue
- Revit LT 2022基本培训 Revit LT 2022 Essential Training
- Rocksdb 的 MergeOperator 简单使用记录