当前位置: 首页 > news >正文

进程控制

进程创建

父子进程,代码共享,数据不修改的话也是共享的

所以子进程刚被创建时,所有数据都是共享的

修改进程之后,发生写时拷贝,父子进程关于该数据指向不同空间(虚拟地址相同,实际地址不同)

OS如何判断什么时候该写时拷贝

更新所有权限为只读--子进程写入--触发系统错误--缺页中断--系统检测 分情况处理(代码段-- 错误/数据区 --写时拷贝)

为什么要拷贝,而不是只开空间

因为修改数据不一定要覆盖原数据,如count++

进程终止

main函数返回值是返回给父进程

这个退出码可表明错误原因

echo $?   error   strerror

echo $?  最近一个程序退出码

error 是 全局变量

strerror(error) 错误码转字符串

进程终止的方式

main函数return

进程调用exit/_exit

exit & _exit

exit在退出前会把缓存区输出

_exit不会刷新缓冲区

exit封装了_exit

我们常说的缓冲区(printf)在什么位置

缓冲区一定不在操作系统内部

这个缓冲区叫做语言级缓冲区,是C/C++自己的缓冲区,和系统没关系

进程异常退出

进程异常:比如int a = 1 / 0; 程序还没运行完就遇到错误被终止

退出信号

退出信号:必须退出信号是零才表示正常退出,

所有退出信号:

我们可以使用kill 加 退出信号模仿各种错误, 使进程退出        

进程等待

wait  waitpid

声明

返回值

作用

wait回收子进程,结束子进程Z状态

返回值>0成功,小于零失败

waitpid   pid==-1任意一个

status是输出型参数,本质是32bit位的位图,不仅包含正常退出码,还有异常退出码等信息,所以status和exit值可能不一样

status中退出码在[8, 15]位(索引)

由status求退出码, 退出信号:

由status返回值获取真正退出码:(status>>8) & oxff 

 

 阻塞等待 & 非阻塞等待

option为0时为阻塞等待, 等待时父进程不可进行其他任务

 option为WNOHANG时为非阻塞等待, 此时要循环调用waitpid进行非阻塞等待,允许父进程在等待时进行其他任务

WNOHANG及Wait NO HANG, 非阻塞等待

非阻塞等待使用方法
#include <iostream>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <functional>
#include "task.h"typedef std::function<void()> task_t;void LoadTask(std::vector<task_t> &tasks)
{tasks.push_back(PrintLog);tasks.push_back(Download);tasks.push_back(Backup);
}int main()
{std::vector<task_t> tasks;LoadTask(tasks);pid_t id = fork();if(id == 0){// childwhile(true){printf("我是子进程, pid : %d\n", getpid());sleep(1);}exit(0);}// fatherwhile(true){sleep(1);pid_t rid = waitpid(id, nullptr, WNOHANG);if(rid > 0){printf("等待子进程%d 成功\n", rid);break;}else if(rid < 0){printf("等待子进程失败\n");break;}else{printf("子进程尚未退出\n");// 做自己的事情for(auto &task : tasks){task();}}}}

进程程序替代

板书笔记


http://www.mrgr.cn/news/40694.html

相关文章:

  • Prompt 模版解析:诗人角色的创意引导与实践
  • 【科研日常】2024年计算图形学与多媒体CCF A、B类会议投稿截止日期汇总
  • springboot系列--web相关知识探索二
  • C++之String类(上)
  • 图解MySQL 1-22 章节相关总结
  • 大数据毕业设计选题推荐-个性化图书推荐系统-Python数据可视化-Hive-Hadoop-Spark
  • SHA-1 是一种不可逆的、固定长度的哈希函数,在 Git 等场景用于生成唯一的标识符来管理对象和数据完整性
  • CSP-J模拟赛(1)补题报告
  • OpenSCAP部署、使用与原理分析
  • 浏览器预解析机制
  • 螺狮壳里做道场:老破机搭建的私人数据中心---Centos下docker学习02(yum源切换及docker安装配置)
  • 叶绿素透射反射率与波长
  • 【AGC005D】~K Perm Counting(计数抽象成图)
  • 爵士编曲:爵士钢琴编写的规律和步骤 关于教程的个人想法 举一反三
  • Java面试必杀技为什么面试官都爱问源码?
  • MacOS配置python环境
  • 数据工程师岗位常见面试问题-3(附回答)
  • Electron应用创建和打包
  • 什么是PRAM及其工作原理
  • 【2022工业3D异常检测文献】BTF: 结合手工制作的3D描述和颜色特征的异常检测方法