主要函数:

fork 用于创建一个新进程

exit 用于终止进程

exec 用于执行一个程序

wait 将父进程挂起,等待子进程结束

getpid 获取当前进程的进程ID

nice 改变进程的优先级

---------------------------------

孤儿进程:

如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,他由init进程收养,成为init进程的子进程。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.  
  8. pid_t pid;
  9. pid = fork();
  10.  
  11. switch( pid )
  12. {
  13. case :
  14. {
  15. while()
  16. {
  17. printf("child pid:%d, parent pid:%d\n", getpid(), getppid());
  18. sleep();
  19. }
  20. }
  21. case -:
  22. {
  23. printf("create child process error\n");
  24. exit(-);
  25. }
  26. default:
  27. {
  28. sleep();
  29. printf("I am parent,pid:%d\n", getpid());
  30. exit();
  31. }
  32.  
  33. }
  34.  
  35. return ;
  36.  
  37. }

child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
child pid:9670, parent pid:9669
I am parent,pid:9669
root@wilson-software:~/Project/xa# child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1
child pid:9670, parent pid:1

从输出结果来看,父进程停止后,子进程变成了孤儿进程,此时子进程的父进程ID 是 1,

(init进程的进程ID值始终是1)由init进程收养。

------------------------------------------------------------------------------

vfork函数创建一个子进程时,操作系统并不将父进程的地址空间完全复制到子进程,用vfork函数创建的子进程共享父进程的地址空间,

也就是说子进程完全运行在父进程的地址空间上。子进程对该地址空间中任何数据的修改同样为父进程所见。

使用fork创建一个子进程时,哪个进程先执行取决于系统的调度。

而vfork创建一个子进程时,vfork保证子进程先运行,子进程调用exec或者exit之前父进程处于阻塞等待状态。

如果在调用exec或者exit之前子进程要依赖父进程的某个行为,就会导致死锁。

如果创建子进程的目的只是为了调用exec执行某个程序,那么fork过程中子进程对父进程地址空间的复制将会是一个多余的过程。

vfork不会拷贝父进程的地址空间,这大大减小了系统开销。

使用vfork时要谨慎,最好不要允许子进程修改与父进程共享的全局变量和局部变量

-------------------------------------------------------------------------------------------------------------------------------------------------

父子进程结束的先后顺序不同会产生不同的结果:

父进程先退出,子进程后退出,则系统会让init进程接管子进程。

当子进程先退出,而父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的

一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程结束,并且父进程调用了wait或waitpid函数,

则父进程会等待子进程。

进程控制fork vfork,父子进程,vfork保证子进程先运行的更多相关文章

  1. linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

    本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生)      使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...

  2. 进程控制fork与vfork

    1. 进程标识符 在前面进程描述一章节里已经介绍过进程的两个基本标识符pid和ppid,现在将详细介绍进程的其他标识符. 每个进程都有非负的整形表示唯一的进程ID.一个进程终止后,其进程ID就可以再次 ...

  3. APUE学习之进程控制 - fork 与 vfork

    最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...

  4. 关于fork( )函数父子进程返回值的问题

    fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init ...

  5. fork后父子进程文件描述问题

    [fork后父子进程文件描述问题] 一张图可以浅析的解释: 参考:http://wenku.baidu.com/view/dd51581bff00bed5b9f31d8e.html

  6. 怎么查看一个进程里fork多少个子进程

    怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 ? ? ?

  7. linux系统编程:进程控制(fork)

    在linux中,用fork来创建一个子进程,该函数有如下特点: 1)执行一次,返回2次,它在父进程中的返回值是子进程的 PID,在子进程中的返回值是 0.子进程想要获得父进程的 PID 需要调用 ge ...

  8. 【Linux 进程】之关于父子进程之间的数据共享分析

    之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...

  9. APUE8进程控制 fork vfork exec

随机推荐

  1. vc++引用外部dll时报error LNK2019: 无法解析的外部符号

    初学cpp,因为之前装linux下各种软件的时候,知道LD_LIBRARY_PATH可以指定动态库的目录.今天在vc集成log4cpp的时候,编译main时报error LNK2019: 无法解析的外 ...

  2. django multidb --- router

    之前一篇随笔, 提到了django中怎么使用多数据库, 但是在实际工程中遇到了一个问题,就是admin指定了使用某库, 在测试环境上没问题, 当部署后(库也变动了位置), 修改一个admin的mode ...

  3. 02:BeautifulSoup

    1.1 BeautifulSoup介绍 1.BeautifulSoup作用 1.BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化 2.之后遍可以使用他 ...

  4. noip杂题题解

    这道题没有什么可说的,先统计,然后几次快排,答案就出来了 Code(整齐但不简洁的代码) #include<iostream> #include<cstdio> #includ ...

  5. 维特比算法Python实现

    前言 维特比算法是隐马尔科夫问题的一个基本问题算法.维特比算法解决的问题是已知观察序列,求最可能的标注序列. 什么是维特比算法? 维特比算法尽管是基于严格的数学模型的算法,但是维特比算法毕竟是算法,因 ...

  6. 关于即来即停app的功能

    Asmallpark软件接口文档说明 编码均采用UTF-8格式传输全部为http,POST请求状态码:200  操作成功    100  服务器异常,稍后再试  404  请求非法  402  数据库 ...

  7. 一个改写MBR的例子

    前言 想要对MBR类的病毒进行一下研究与学习,在此期间,看了很多资料,其中帮助最大的就是金龟子学姐和willj学长发表的文章.一个从源码与实现角度来讲了一下,另外一个从反病毒角度来分析.   功能描述 ...

  8. Nginx 负载均衡的几种方式

    如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用.具体配置过程如下: 1. 在http节点下,添加ups ...

  9. Sass常用写法

    Sass使用变量,变量以$开头 $bgcolor:#f40; background-color:$bgcolor; 如果变量需要嵌套在字符串当中,就需要写在#{}之中 $direction:left; ...

  10. C#学习笔记(十三):继承

    继承 object是引用类型 public:最高权限,公开的 Protected:外部不可以访问 Internal:类的默认访问是什么作用域 Private:类成员默认   基类实例:可以通过base ...