在博文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. Spring in Action 4 读书笔记之使用标签创建 AOP
  2. 关于MSSQL数据存储的问题
  3. android studio crashlytics,完美解决Android Studio集成crashlytics后无法编译的问题
  4. Spring Social入门–第2部分
  5. mysql默认字符集和排序_MySQL字符集和排序规则
  6. android webview_在 Flutter 中使用 WebView
  7. java 上传断点续传_JAVA大文件上传断点续传解决方案
  8. CCF202012-4 食材运输(100分题解链接)
  9. 大道至简java伪代码
  10. 如何通过FTP从Mac快速发送和接收文件
  11. 77个互联网+大学生创新创业大赛文档
  12. 基于Hadoop的数据分析案例-陌陌聊天软件数据分析
  13. Socket通讯连接常见错误代码
  14. Python 按时间顺序读取所选目录下文件
  15. 【Linux】RHCE -- RHCSA 认证考试 模拟练习题解析
  16. 7-4 sdust-Java-学生成绩读取与排序 (35分)CSDN-markdown编辑器
  17. Hi3516DV300
  18. opencv 去除背景
  19. 机器学习模型训练测试完整步骤
  20. Spark使用RDD实现分组topN(八种方法)

热门文章

  1. 使用Python,OpenCV进行图像哈希
  2. LabVIEW仪表盘识别(实战篇—6)
  3. 【python】 OSError:sift not found 问题解决
  4. LeetCode刷题记录10——434. Number of Segments in a String(easy)
  5. 练习2:课工场响应式导航条_作业帮直播课APP下载最新版入口
  6. nanoflann库
  7. 剑指offer:面试题20. 表示数值的字符串
  8. 电话号码正则表达式键盘弹起验证
  9. 京东广告典型源码示例二
  10. 《DDIA》读书笔记