在博文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下创建进程简介相关推荐

  1. Windows下创建进程简介

    正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...

  2. java 创建进程_Linux下创建进程简介

    进程创建的UNIX模型为分叉----执行(fork----exec)模型.fork函数调用生成一个完全复制父进程内存的子进程.exec函数调用以一个新的可执行文件替换当前进程.这两个调用通常一起使用, ...

  3. linux下多进程编程简介

    两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...

  4. linux下创建svn仓库及用户

    1 Linux下创建svn仓库 1.1 启动SVN服务 svnserve -d -r  /SVNRootDirectry 其中SVNRootDirectry是你的SVN 根目录,例如192.85.1. ...

  5. linux下查看进程的线程数,linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  6. 查看linux进程的设备io,Linux下查看进程IO工具iopp

    Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...

  7. Linux创建进程必须fork么,Linux - fork() 创建进程

    Linux - fork() 创建进程 Linux - fork() 创建进程 介绍创建进程之前,先简单地介绍一下 Linux 下的进程内存布局. Stack - 所有函数的 local variab ...

  8. 【Linux】从冯诺依曼体系到初识Linux下的进程

    目录 前言 1.冯诺依曼体系结构 2.管理和操作系统 3.初识进程 1.描述进程PCB(process control block) 1.标识符pid fork接口创建子进程 2.进程状态 3.进程优 ...

  9. linux sftp创建多用户,Linux 下创建 sftp 用户并限定目录

    Linux 下创建 sftp 用户并限定目录 1.创建 sftpUser 用户组 [root@XXX ~]# groupadd sftpUser 2.创建 sftpUser 用户并指定目录 [root ...

最新文章

  1. hdu4126(MST + 树形dp
  2. Shopify 英文(多国语言)国际网店 注册指南
  3. 垃圾分类:人机搭配,干活不累
  4. 安装Selenium
  5. R学习笔记-安装R和RStudio,注意RStudio的版本需要与操作系统版本匹配
  6. Elasticsearch Index Template(索引模板)
  7. 辅助功能性代码,研究和记录代码。
  8. FormsAuthentication使用指南
  9. 乐高spike python_SPIKE Prime科创套装 篇四:乐高教育SPIKE Prime入门编程和搭建活动教学...
  10. 数据挖掘 应用案例集
  11. spring手动控制事务开启_手动控制spring事务
  12. 熊猫阿波的故事 2201
  13. python基础教程: for 循环用法
  14. 计算长方形或正方形的周长和面积
  15. python爬虫小实例
  16. VS2015企业版,社区版,专业版详细对比
  17. HashMap的链表结构
  18. Excel数据如何导入到Oracle数据库中
  19. 计算机网络和因特网大二暑假
  20. 湖南工业大学电费数据抓取(完美校园版)

热门文章

  1. Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了
  2. OpenCV-Python官方文档学习笔记(上)
  3. 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码
  4. 【Pandas库】(6) 索引操作--改、查、高级索引
  5. 腐蚀rust电脑分辨率调多少_腐蚀Rust怎么设置画面 腐蚀Rust提高帧数画面设置方法...
  6. PCL中outofcore模块---基于核外八叉树的大规模点云的显示
  7. Qt中openGL的四个重要事件(initializeGL() resizeGL() paintGL() pdateGL())调用规则
  8. 根据keyName(如:result.data.name),无限深度遍历获取keyValue
  9. Revit LT 2022基本培训 Revit LT 2022 Essential Training
  10. Rocksdb 的 MergeOperator 简单使用记录