目录

  • 一、学习的知识点
    • fork函数
      • 变量的变化
      • 文件描述符的变化
    • 1.1僵尸状态
    • 1.2孤儿
    • 1.3如何避免僵尸进程
      • 1.3.1 wait
      • 1.3.2 waitpid
    • 2 execlp
    • 守护进程
  • 二、上课没有听懂或者没有理解的地方
  • 三、当天学习的收获

一、学习的知识点

fork函数

fork函数产生两个进程,一个是主进程,也就是父进程,另一个是子进程。有两个返回值,一个返回值大于0,表示父进程,值为子进程的pid。一个返回值等于0,表示子进程。

变量的变化

fork以后,子进程对父进程 RW段(已初始化) BSS段(未初始化)的数据遵循写时拷贝,有改动时才执行拷贝,而RO段的数据是共用的

文件描述符的变化

fork前open的文件,fork后的子进程后父进程都有相同的文件描述符,但fork后open的文件只有执行open的进程才有对应的文件描述符。我的理解是文件描述符可以继承但不是共享的。

1.1僵尸状态

一个子进程结束运行时,父进程还存在

  1. 子进程进入僵尸状态,因为进程结束的返回码还需要给父进程 exit(0)
  2. 子进程不再活跃(不执行逻辑),但是资源无法释放(CPU/内存/数据)
  3. 以上总结说明 程序操作的时候不希望出现 僵尸状态的情况。

1.2孤儿

父进程先于子进程结束

  1. 父进程没了PID消失,父进程的所有子代进程都属于孤儿进程
  2. 父进程吧子进程托孤给系统管理
  3. 以上总结说明 程序操作的时候不希望出现。

1.3如何避免僵尸进程

1.3.1 wait

pid_t wait(int *status);
wait函数用于使父进程阻塞,只能让父进程等待子进程,不能使子进程等待父进程。
wait的返回值,如果等待成功 返回等待的pid号,出错则返回-1。
status参数 用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:pid = wait(NULL);
wait函数特点

  1. 如果有多个子进程在运行,那么wait函数只会等待先结束的子进程

1.3.2 waitpid

pid_t waitpid(pid_t pid, int * status, int options) ; 等待某个指定的子进程。等待进程ID为pid的进程

  • pid == -1 等待任一子进程。于是在这一功能方面waitpid与wait等效。
  • pid > 0 等待其进程I D与p i d相等的子进程。
  • pid == 0 等待其组I D等于调用进程的组I D的任一子进程。
  • pid < -1 等待其组I D等于p i d的绝对值的任一子进程。

2 execlp

在子进程里调用另外一个程序
execl系列函数的作用就是可以在你创建的子进程中调用其他人写好的可执行程序
execlp是替换进程映像 相关函数只要调用,后面的代码都不会执行 +p会导入系统的环境变量
execlp(“ls”, “ls -l”, NULL);
execlp(“ps”,“ps”,"-ax",0);

守护进程

概念:程序一旦启动就会转入后台,不会因为关闭终端而结束进程

  • 最重要的特性是后台运行
  • 如果你要脱离终端运行,首先要创建一个新的会话 创建会话函数 setsid();
  • 默认情况下 父进程不能创建会话
  • 创建的守护进程不要使用 printf、cout等输出函数。因为脱离终端 而字符输出依赖于终端 所以输出了也看不见
  • 在Linux中 输入输出都有设备 他有专门的文件描述符 0 1 2错误输出
  • 所以创建完守护进程后 也要分别关闭 close(0) close(1) close(2)
  • 在默认程序后
  • 一个终端可以运行很多进程 多个进程会组成会话 session 会话有权利创建终端
  • 一个进程可以产生子进程,产生多个子进程 为进程组 默认情况下父进程就是进程组组长
void create_deamons()
{pid_t pid = fork();if (pid == 0){setsid();//因为父进程默认是进程组组长,所以不允许调用setsid函数来创建会话//子进程成功创建了会话,默认称为会话的领导者,这个会话领导者有一个权力:可以创建一个新的终端pid = fork();if (pid == 0){//while循环要替换成守护进程的功能代码段while (1){sleep(1);}//再创建一个子进程的时候,这个子进程不是会话组组长他就没有权力创建新的进程,真正脱离了终端运行//这里面的代码才是真正的守护进程代码}_exit(0);}else if (pid > 0){_exit(0); //要写在父进程中 否则子进程会被杀死}
}for(int i =0;i<=2;i+)
{close(i);
}
//关闭键盘 显示器 错误输出(并不是一定 一般规则如此)

二、上课没有听懂或者没有理解的地方

三、当天学习的收获

避免僵尸进程

210120 阶段三 fork与阻塞函数相关推荐

  1. 多进程fork()函数

    参考<TCP\IP网络编程> 多进程服务器端 fork()函数 fork()函数从当前进程中创建一个子进程,子进程和父进程的环境完全一样,除了父子进程中fork()函数返回的进程ID号,在 ...

  2. linux中fork()函数具体解释(原创!!实例解说)

     一.fork入门知识 一个进程,包含代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程差点儿全然同样的进程,也就是两个进程能够做全然同样的事,但假设初始參数或者传入的变量不 ...

  3. linux中c语言kbhit函数用法,C语言判断用户是否输入-非阻塞函数kbhit

    一.基础研究 要从地址读取数据,肯定是要定义一个指针变量p,用它来实现变换地址和取值的功能.另外程序是当两个条件中的某一个出现时才停止,所以应该用while~do循环语句循环输出n和d,并用while ...

  4. Vue生命周期总结(四个阶段,八个钩子函数)

    生命周期就是组件或者实例,从创建到被销毁(初始化化数据.编译模板.挂载DOM.渲染一更新一渲染.卸载)的一系列过程,我们称这是Vue的生命周期 文章目录 一.Vue的生命周期阶段 二.生命周期钩子函数 ...

  5. 阶段三: 路由 vue-router

    阶段三: 路由 vue-router v3 => vue2 v4 => vue3 文档: https://v3.router.vuejs.org/zh/installation.html ...

  6. C++学习笔记 - 阶段三:C++核心编程 - Chapter7:类和对象-C++运算符重载

    阶段三:C++核心编程 Chapter7:类和对象-C++运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 7.1 加号运算符重载 作用:实现两个自定义数 ...

  7. linux操作系统-----Fork()函数

     目录 进程 fork()函数 ps -ef命令的使用 top命令的使用 进程创建--fork()函数 例题一 例题二 例题三 进程 进程是操作系统中最重要的概念之一.在计算机系统中,进程不仅是最基本 ...

  8. 三种睡眠时间函数的区别:linux 的sleep()、usleep()、nanosleep()函数

    三种睡眠时间函数的区别:linux 的sleep().usleep().nanosleep()函数 (1)sleep()-------以秒为单位 unsigned int sleep(unsigned ...

  9. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

最新文章

  1. C语言基础之--scanf函数
  2. Thymeleaf读取model里面的对象||Thymeleaf读取model里面的集合||Themeleaf在js中取值||访问带参数的消息||ThymeleafObjects的使用[取三大作域的值
  3. dns-prefetch—DNS预解析技术
  4. dp 1.4协议_浅析关于HDMI接口与DP接口
  5. Exception 和解决办法
  6. BugkuCTF-Crypto题Crack it
  7. 从入门到精通 pdf_【推荐】铅笔素描从入门到精通pdf|素描基础教程电子书下载!...
  8. 【研究】Joomla二阶注入
  9. cad显示驱动程序文件已丢失或损坏_win7系统下打开AutoCAD 2014时显示驱动程序文件.hdi丢失如何解决...
  10. ZJOI2007时态同步
  11. 往PPT幻灯中添加图片的方法有哪些?
  12. 【visio 绘图矢量图素材网站】
  13. 老电脑宏基E1-471G SSD 装win10系统
  14. 加载配置文件(xml文件,properties文件)demo
  15. 逆向Mac版WPS2019解除版本过期限制
  16. 2008年全国大学生数学建模D题(加附件)
  17. 开源项目--阿里巴巴腾讯Google
  18. 当下垂直搜索引擎集锦一
  19. CCF关于NOIP2018获奖证书发放的公告
  20. 聚类算法Clustering-KMeans/DBSCAN/DenPeak/NormalizeCut/RCC

热门文章

  1. python 运行日志logging代替方案
  2. 建立基于以太坊的私有网络和智能合约
  3. 福建物联网产业发展势头良好
  4. iOS工程引入ios-charts-master
  5. CodeForces 699A Launch of Collider
  6. mongodb 的windows 下安装
  7. OpenDNS,独特的免费DNS
  8. 查看was中项目类的加载顺序
  9. 网络协议基础:“工作中模模糊糊的概念,这次终于理顺了!”
  10. java加密文件夹_使用java.util.zip压缩文件夹,支持加密,增加描述