进程创建的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 zero

if (f == 0) {

fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());

}

// parent process because return value non-zero

else 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”两个输出是可能的,因为父进程和子进程同时运行。因此,我们不知道操作系统是先将控制权交给父进程还是子进程。父进程和子进程正在运行同一程序,但这并不意味着它们是相同的。操作系统为这两个进程分配不同的数据和状态,并且这些进程的控制流可以不同。执行结果如下图所示:

java 创建进程_Linux下创建进程简介相关推荐

  1. 项目下创建文件_Linux 下创建和使用交换文件

    前言:还有5天即将元旦,一元初始,如是说:新的黎明希望闪耀.今天为大家分享Linux中交换文件的使用和概念. 一,什么是 Linux 的交换文件? 交换文件允许 Linux 将磁盘空间模拟为内存,当你 ...

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

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

  3. mysql查看文件句柄数_Linux下查看进程打开的文件句柄数

    在 Linux 平台上运行的进程都会从系统资源申请一定数量的句柄,而且系统控制了进程能够申请的最大句柄数量.用户程序如果不及时释放无用的句柄,将会引起句柄泄露,从而可能造成申请资源失败,导致系统文件句 ...

  4. linux python虚拟环境搭建_Linux 下创建python 虚拟环境

    简要记录 Linux 下安装python虚拟环境的方法.以下内容基于 python2.7 版本 1 安装virtualenv pip install virtualenv 检查版本 virtualen ...

  5. JAVA项目linux僵尸进程_linux杀死僵尸进程

    ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9 1.查看系统是否有僵尸进程 使用Top命 ...

  6. linux proc 目录清理_Linux下/proc目录简介

    proc简介 在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目 ...

  7. linux postgresql 创建数据库,Linux下创建Postgresql数据库的方法步骤

    Linux下创建Postgresql数据库的方法步骤 前言 PostgreSQL (也叫 Postgres)是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行. ...

  8. linux环境下查看进程,Linux下查看进程(程序)启动时的环境变量

    背景: 因最近试安装Linux下的jira,有一个中文插件安装后,一旦设置开机启动后,它是英文,而在终端再重新启动一次后呢,似乎插件生效,它又恢复为正常中文界面,我首先想这这涉及到一个环境变量的问题, ...

  9. linux在vi创建文件,Linux下创建文本文件(vi/vim命令使用详解)

    vi test.txt 或者 vim test.txt 再或者 touch test.txt vim是vi的升级版,指令更多,功能更强. 下面是收集的vim用法,当在vim里面要实现退出,首先要做的是 ...

最新文章

  1. Spring2.5整合JPA
  2. JDK8的排序大法!!
  3. olive videoeditor开源跨平台视频编辑器
  4. docker+mysql创建用户名密码_docker构建私有仓库并设置仓库用户和密码
  5. 安装Labview2012 “labview 2012 未定义必须的 NIPathsDir属性 maxAFWDIR”
  6. POJ 3415 Common Substrings (求长度不小于k的公共子串的个数)
  7. jQuery,Table表头固定插件chromatable存在的问题及解决办法
  8. delphi html 登录,delphi 几个实用的HTML解析函数
  9. swf文件格式解析(一)
  10. 模拟登陆webqq总结(一)
  11. linux搭建dlna媒体服务器,Serviio:一款功能强大的DLNA媒体服务器软件
  12. word转pdf组合的图片出现灰线,如何处理
  13. 关于谷哥传奇工程师Jeff Dean的笑话
  14. SQL Server 2008 Service Pack 1 - CTP 发布
  15. VirtualBox中Windows 7虚拟机无法全屏显示怎么办?
  16. 将项目从 SVN 迁移到 GIT
  17. c++bitset用法详解(超简单)——蒟蒻函数
  18. 随机森林(RandomForest,RF)网格搜索法调参
  19. 人生最不该挥霍的3样东西
  20. Java程序设计(2021春)——第三章类的重用笔记与思考

热门文章

  1. php 回收png,关于php:从其他Png中减去Png,保留透明度,ImageMagick
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的电费用电管理系统
  3. hive 中文字符过滤_0650-6.2.0-通过UDF实现HiveImpala的中文拼音排序
  4. centos下openfire安装(转)
  5. linq to xml查询绑定GridView
  6. 购买女装摩托车(踏板车)
  7. 从C语言到C++的进阶之C++的非类新特性(篇三)
  8. nvm use切换node版本,但是切换后没有*号
  9. linux系统开启多路径,Linux系统怎么配置多路径
  10. inset() php,inset.php · L@Y/studentscoremanagementsystem - Gitee.com