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

有table做的网站/百度网页推广

有table做的网站,百度网页推广,我们做的网站是优化型结构,短链接生成器原理目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么? 2、进程终止,有三种情况 3、进程如何终止? 三…

目录

一、进程创建

1、实例

2、fork函数详解

(1)fork函数模板

(2). fork() 函数的工作原理

(3). fork() 返回值和错误处理

3、如何理解进程创建过程

二、进程终止

1、终止是在做什么?

2、进程终止,有三种情况

3、进程如何终止?

三、进程等待

1、为什么要等待?

2、怎么等待?

(1)wait函数

(2)waitpid函数

四、阻塞等待与非阻塞等待


一、进程创建

1、实例

int main()
{ pid_t pid;pid = fork();if(pid < 0){//创建失败printf("forkfailed\n");return 1;//终止程序,退出码设置为1,以显示错误退出}else if(pid == 0){//子进程printf("I am a child process!,chailPID:%d\n",getpid());}else {//父进程,返回值>0 printf("I am a father process!,fatherPID:%d,childPID:%d\n",getpid(),pid);}return 0;
}

2、fork函数详解

(1)fork函数模板

#include <unistd.h>pid_t fork(void);

fork() 函数返回两次,
一次在父进程中返回子进程的进程 ID (PID),
一次在子进程中返回 0。
如果 fork() 失败,返回一个负值,表示错误。

(2). fork() 函数的工作原理

调用 fork() 函数时,操作系统会创建一个新的进程(子进程),该子进程是调用进程(父进程)的一个副本。
新进程(子进程)会复制父进程的地址空间、代码段、数据段和堆栈等信息,但是它们会有各自独立的内存空间。
子进程的 PID 和父进程不同,但是它们会继承父进程的文件描述符和信号处理器等。
fork() 后,父进程和子进程同时开始执行代码,但是它们执行的顺序和执行的内容可能有所不同,具体取决于操作系统的调度策略。

(3). fork() 返回值和错误处理

如果 fork() 返回值 >  0,则这是在父进程中返回的子进程的 PID。
如果 fork() 返回值等 == 0,则这是在子进程中返回的。
如果 fork() 返回值 <  0,则表示创建新进程失败,可能是因为系统资源不足或者其他错误。

3、如何理解进程创建过程

进程:内核的相关管理数据结构(task_struct mm_struct)+ 页表 + 代码和数据
上述对进程的描述,是从进程具有独立性的角度出发去看待
进程具有独立性,说明有各自的PCB、页表、数据;
而代码虽然是共享的,但是权限是只读的不能修改,因此互不影响

当使用fork创建进程时:
分配新的内存块和内核数据结构给子进程
将父进程部分数据结构内容拷贝给子进程
添加子进程到系统进程列表中
fork返回,开始调度器调度

为什么给父进程返回子进程的PID,给子进程返回0?
前者因为方便父进程对子进程标识的管理
后者因为返回创建成功与否的标志

fork常规用法:子进程执行和父进程类似的任务 / 子进车执行全新的任务

fork调用失败的原因
系统进程太多,资源不够

二、进程终止

1、终止是在做什么?

释放曾经的代码和数据所占据的空间
释放内核数据结构(但是task_struct延后,Z状态的僵尸进程)

2、进程终止,有三种情况

a、代码跑完,结果正确

b、代码跑完,结果不正确
那么,代码跑完,正确不正确,我怎么知道?怎么判断?
可以通过进程的退出码决定

c、代码没有跑完,异常提前退出
如果进程异常,退出码就没有意义
但是,如果出现了异常,我想知道,为什么出现异常?出现了什么异常?
出现什么异常,通过看退出信号是多少判断
进程出现异常,本质是因为进程收到了OS发给进程的信号
例如:kill -9 XXX
这个命令本质是XXX进程收到了OS的信号,为9,就会以killed的形式终止

那么,如何判断进程终止是处于上述三种情况的哪一种?
1、先确认是否异常退出
2、如果不是异常,就说明代码跑完,看退出码

因此,衡量一个进程退出到底是什么情况?
需要两个数字:退出码(跑完) + 退出信号(异常)的组合
而这个退出信息,要给父进程bash知道,确保父进程对子进程的管理
因此,进程的PCB task_struct就会存在两个属性:

int sig_code
int exit_code

在vs编程运行崩溃时,发生了什么?
是因为进程做了不该做的事情,OS杀掉了进程

main函数的返回值是什么意思?

int main()

{

        //...

        return 0;

}

是本进程的退出码,这个退出码交给父进程,让父进程知道子进程退出的情况(成功 / 失败且失败的原因是什么)
退出码为0,表示成功
退出码不为0,表示失败

查看退出码:

echo $?

?这个问号,是父进程bash获取到的,最近一个子进程退出的退出码

返回值返回给谁?返回给父进程bash
这个返回值是退出码,退出码交给bash之后,如果不是0,表示错误
此时bash会通过一定的形式将退出码转化为错误描述,strerrot函数

char* strerrot(int erronum):错误码转化为错误描述

以下是常见错误:

错误码 (errnum)错误描述 (错误码对应的错误描述)
1操作不允许的权限
2系统找不到指定的文件
3系统找不到指定的路径
4系统没有空间供处理此操作
5输入/输出错误
6设备不可用
7存储设备无法访问
8请求的文件描述符超出范围
9文件已经打开
10操作过多的文件系统
11资源暂时不可用
12文件名过长
13权限不足,拒绝访问
14资源暂时不可用,尝试再次

main函数为什么要有返回值?
这是因为本质上,我们自己写的所有进程任务,都是bash的子进程
而子进程的运行状况如何,父进程得知道,便于对子进程的管理
所以,父进程怎么知道子进程的状态呢?通过main函数的返回值判断
所以,main函数返回值的本质,是通知父进程任务执行情况

又为什么返回0?
0表示进程执行成功
非0表示失败,而且用不同的非0数字表示错误的原因类型,每个数字对应一个错误的描述

char* strerrot(int erronum):错误码转化为错误描述

3、进程如何终止?

a、main函数中直接return,表示进程终止(非main函数,return表示函数结束)

b、代码调用exit函数(引起一个正常的进程终止)
参数类似于main函数的return退出码
当调用exit函数时,可以在进程的任意位置退出

c、_exit(终止一个调用进程)
exit和_exit的区别是什么?
区别在于exit在退出时,会刷新缓冲区;_exit不会
exit是C语言库函数;_exit是系统调用
所以,本质上,exit一定会调用_exit系统接口
因为不允许用户直接越过操作系统访问底层的进程数据
所以,我们可以知道,缓冲区是介于系统调用和库函数之间的
也就是说,缓冲区不是操作系统内核缓冲区

三、进程等待

任何进程,在退出的情况下,一般必须要被父进程进行等待
如果退出时,父进程不管不顾,退出进程就会处于Z(僵尸状态),长期如此,就会造成内存泄漏
僵尸状态:进程没有被执行,不在CPU的运行队列,此时操作系统就会回收存在内存中的代码数据,但是不会释放PCB结构体
同时,僵尸进程无法被杀死,因为已经死了的僵尸,不能死两次
具体详情,可以参考博主的其他文章:零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级_僵尸进程孤儿进程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_51216031/article/details/140850173?spm=1001.2014.3001.5501

1、为什么要等待?

(1)通过父进程等待,解决子进程退出时的僵尸问题,回收系统资源
(2)获取子进程的退出信息(因为父进程要知道子进程因为什么退出,但是并非必要)

2、怎么等待?

通过wait / waitpid函数

(1)wait函数

wait 函数是一个阻塞式的系统调用,用于暂停父进程的执行,直到一个子进程结束或者收到一个信号为止。一旦子进程终止,wait 函数会获取子进程的终止状态并返回。

pid_t wait (int *status);//返回值是,等待成功时,子进程的pid
status:等待父进程中,任意一个子进程退出,如果不关心子进程的退出状态,可以传入 NULL。

返回值:如果成功,返回终止子进程的进程ID(PID)。
如果出错,返回 -1。

如果子进程没有退出,父进程一直在阻塞等待状态,即S(sleeping)状体
这种阻塞,本质是在等待子进程这个软件状态就绪,即返回信息,再死亡释放子进程

(2)waitpid函数

pid_t waitpid(pid_t pid, int *status, int options);
返回值:当正常返回的时候,返回收集到子进程的进程ID

参数:

第一个参数pid:等待的子进程PID:
< -1:等待进程组ID等于pid绝对值的任何子进程。
-1:等待任何子进程。
0:等待与调用进程在同一进程组的任何子进程。
> 0:等待指定PID的子进程。

第二个参数status:一个整型指针,用于存储子进程的退出状态信息。如果不关心子进程的退出状态,可以传入 NULL。

第三个参数options:指定等待的选项,例如 WNOHANG 可以使 waitpid 成为非阻塞的。

返回值:如果成功,返回终止子进程的进程ID(PID)。
如果出错,返回 -1。

WIFEXITED(status):获取退出码,返回值非0为正常退出,不正常为0

子进程返回的信息,就是通过wait_pid中的参数status获取的
因此,status不能简单视为一个整数
status在32位下,我们只关心低16位
在这16位中,8-15表示退出状态,0-6表示退出信号

低16位的含义:

退出状态:位于低16位的8-15位。这个部分表示子进程的退出状态。通常,如果子进程正常退出,这个状态会是0。
退出信号:位于低16位的0-6位。这部分表示导致子进程终止的信号。如果子进程不是正常退出(比如因为接收到了某个信号而终止),那么这部分会包含有关信号的信息。

四、阻塞等待与非阻塞等待

如果子进程没有退出
此时父进程在执行waitpid进行等待,处于阻塞等待状态
进程阻塞的本质就是进程不在运行调度队列中,状态不为R
如果父进程一直处于阻塞状态,就相当于父进程什么也没有做,就只是在等待子进程的退出
这样不好
那么可不可以让父进程不处于阻塞状态去等待呢?
可以,这种状态叫做非阻塞等待
怎么做?设置函数参数

pid_t waitpid(pid_t pid, int *status, int options);

对于该函数的options参数值设置为WNOHANG值(一个宏)
WNOHANG 是一个宏定义,通常在使用 waitpid 函数时用作参数,用于指定在调用 waitpid 函数时的父进程处于非阻塞等待状态。
具体来说:WNOHANG 的全称是 "Wait No Hang"。
非阻塞等待的时候 + 循环 = 非阻塞轮询
在非阻塞轮询情形下,父进程就可以做其他的事情

如何理解呢?

假设,你有一个女朋友,假设,注意,我说的是假设哈
你在大学谈了一个女朋友
周末你约她出去玩,可是她说他要化妆,要打扮一下
于是你就到她的宿舍楼下等
此时,你和你女朋友的处境就相当于子进程和父进程
你是父进程,你女朋友是子进程

如果在等的期间,你一句话都不敢说,啥也不敢做,
就像一个二棒槌一样杵在楼下等待
那么,此时你这个父进程就相当于阻塞等待状态
啥也没做,就是等,浪费生命,浪费时间

但是,如果你在等的期间,你每隔几分钟打个电话问个情况,说好了没有啊?
如果她告诉你好了,就出发
如果她告诉你没有好,那你也不能像棒槌一样干杵着
所以,你就刷刷抖音,欣赏欣赏风景,做自己的事情
然后再时不时打电话问情况
好了,就出发;没好,就做自己的事情
于是,此时,你和你女朋友的状态,就相当于非阻塞等待状态
打电话相当于一个函数调用,她给你的答复好没好是返回值
你拿到这个返回值当作一个参数,作为参考
返回值为好了,你就结束等待
返回值为没好,你就继续做手头的事情
这就是非阻塞等待状态
同时,你每隔几分钟打一次电话,
这个就叫做轮询
所以,
非阻塞等待的时候 + 循环 = 非阻塞轮询
在非阻塞轮询情形下,父进程就可以做其他的事情

虚拟地址空间是时代技术发展的产物
代码是只读属性,为什么是只读?
因为页表的权限设置只有只读,而我们使用的都是虚拟地址
会被页表部分修改命令被拦截

相关文章:

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么&#xff1f; 2、进程终止&#xff0c;有三种情况 3、进程如何终止&#xff1f; 三…...

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…...

一篇文章让你用我的世界中的红石搞懂什么是ALU!

目录 1.一些在开始的约定 2.七大逻辑门电路 1、 与门 2、 或门 3、 非门 5、 或非门 6、 异或门 7、 同或门 3.半加器 4.全加器 5.ALU 1.一些在开始的约定 相同的概念&#xff1a;相同的概念&#xff1a;高电平低电平逻辑真逻辑假 开关的开 开关的关 灯的亮 灯…...

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代&#xff0c;硬盘作为我们存储重要数据的核心设备&#xff0c;其重要性不言而喻。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、硬盘故障等&#xff0c;我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全&#xff0c;更可能影响到我…...

基于SpringBoot+Vue的科研管理系统(带1w+文档)

基于SpringBootVue的科研管理系统(带1w文档) 基于SpringBootVue的科研管理系统(带1w文档) 科研的管理系统设计过程中采用Java开发语言,B/S结构&#xff0c;采取springboot框架&#xff0c;并以MySql为数据库进行开发。结合以上技术&#xff0c;对本系统的整体、数据库、功能模块…...

计算机组成原理 —— 五段式指令流水线

计算机组成原理 —— 五段式指令流水线 五段式指令流水线运算类指令LOAD指令的执行过程STORE指令的执行过程条件转移指令执行过程无条件转移指令的执行过程 我们今天来看看五段式指令流水线&#xff1a; 五段式指令流水线 五段式指令流水线是一种常见的处理器架构设计中采用的…...

【Bigdata】什么是关系联机分析处理

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 &#x1f3b5; 许飞《父亲写的散文诗》 关系联机分析处理&#xff08;Relational Online Analytical Processing&#xff0c;简称 ROLA…...

svd在求解最小二乘中的应用

文章目录 线性最小二乘的直接解法&#xff08;正规方程解法&#xff09;什么是伪逆&#xff1f;伪逆矩阵的一般形式伪逆矩阵与SVD的关系 线性最小二乘的直接解法&#xff08;正规方程解法&#xff09; 对于 A x b \boldsymbol{A}xb Axb的线性最小二乘问题&#xff0c;有直解析…...

JVM—垃圾收集算法和HotSpot算法实现细节

参考资料&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明 1、分代回收策略 分代的垃圾回收策略&#xff0c;是基于这样一个事实&#xff1a;不同的对象的生命周期是不一样的。因此&#xff0c;不同生命周期的对象可以采取…...

nvidia系列教程-AGX-Orin基础环境搭建

目录 前言 一、Agx-Orin&#xff08;32GB&#xff09;介绍 1.1 GPU 1.2 CPU 1.3 NVDLA 1.4 内存 1.5 存储 二、安装JetPack SDK 三、基础环境配置 四、jetpack软件版本 总结 前言 NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台&#xff0c;专为需要高性能和低…...

使用SpringAOP实现公共字段填充

文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表…...

c++初阶-----适配器---priority_queue

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...

VS Code 和 Visual Studio 哪个更好

文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款开源的、免费的、跨平台的、轻量级的代码编…...

FCA-数据分析理论试卷

其他参考&#xff1a; https://segmentfault.com/a/1190000043363073 https://blog.csdn.net/CSDN_WYY/article/details/137082340 Part.1&#xff1a;判断题&#xff08;总分&#xff1a;8分 得分&#xff1a;8&#xff09; 第1题 判断题 对任意事件A和B&#xff0c;必有 …...

WPF程序通过CadLib4加载CAD .dwg格式文件

1、下载CadLib相关dll文件&#xff0c;主要用到的&#xff1a;WW.dll、WW.Cad.dll、WW.GL.dll 2、程序中引用dll库。 3、创建WPF程序&#xff0c;使用Canvas来加载dwg文件&#xff0c;支持拖动和放大缩小。 4、部分代码&#xff1a; public void Init(string filename) {tr…...

图表全能王(ChartStudio) 上架VisionPro!

图表全能王(ChartStudio) - 终极图表制作工具&#xff01;支持条形图、折线图、面积图、柱形图、条形图、饼图、玫瑰图、雷达图、牛肉图、风琴图、旭日图、桑基图等图表。 https://apps.apple.com/app/chartstudio-data-analysis/id6474099675 https://apps.apple.com/cn/app/…...

【云原生】Job一次性任务详解

Job一次性任务 文章目录 Job一次性任务一、Job介绍二、运行示例Job 一、Job介绍 Job会创建一个或者多个Pod&#xff0c;并将继续重试Pod的执行&#xff0c;直到指定数量的Pod成功终止。随着Pod成功借宿&#xff0c;Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值…...

化工厂人员定位采用多种定位技术的融合定位系统的好处

由于化工厂内环境的复杂性和危险性&#xff0c;通常单一的定位技术很难满足全厂区的人员定位需求&#xff0c;如果能将不同定位技术融合在一起&#xff0c;发挥出它们各自的优势&#xff0c;那么就能解决以上问题。 融合定位技术诞生背景 随着科技的不断发展&#xff0c;多种定…...

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展&#xff0c;AI绘图工具在图像生成和艺术创作方面变得越来越强大&#xff0c;无论你是一个设计师、艺术家&#xff0c;还是仅仅对生成艺术感兴趣的爱好者&#xff0c;AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中&#xff0c;…...

迷你主机:华硕PN65和nuc13pro如何选择?

华硕PN65与NUC 13 Pro&#xff1a;如何做出选择&#xff1f; 在追求高效能与便携性的今天&#xff0c;迷你主机成为了越来越多用户的选择。华硕PN65与英特尔NUC 13 Pro作为市场上两款备受瞩目的产品&#xff0c;各自拥有独特的优势和特点。本文将从处理器性能、扩展性、接口丰…...

分享一个好用的印花重绘工具

本文向大家介绍一款革命性的 AI 工具&#xff0c;它能够将模糊不清的图片转化为具有照片级别的高清图像。这项前沿项目依托于大规模人工智能技术&#xff0c;革新了图像恢复领域。通过文本驱动和智能修复功能&#xff0c;它巧妙地结合了先进的 AI 技术与创新理念&#xff0c;为…...

力扣题解(递增的三元子序列)

334. 递增的三元子序列 给你一个整数数组 nums &#xff0c;判断这个数组中是否存在长度为 3 的递增子序列。 如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k &#xff0c;使得 nums[i] < nums[j] < nums[k] &#xff0c;返回 true &#xff1b;否则&#…...

做不好PPT的原因

新手制作PPT长犯的10个错误 1.Word搬家 为了节约时间&#xff0c;直接把Word素材复制粘贴到PPT上&#xff0c;没有提炼 2.堆积图表 每个页面上堆积了大量的图表&#xff0c;却没有说明数据反映了什么趋势 3.图表业余 想用图表达自己的逻辑&#xff0c;但没有专业的模板&a…...

嵌入式人工智能(45-基于树莓派4B的扩展板-舵机驱动板PCA9685)

1、简介 智能小车、机械臂、摄像头云台会有多个舵机&#xff0c;而微控制器芯片的PWM输出引脚不够的情况下&#xff0c;就可以用PCA9685&#xff08;16路舵机&#xff09;来解决这一问题。 PCA9685是一款I2C总线控制的16通道LED控制器&#xff0c;专为红/绿/蓝/琥珀&#xff…...

【数据结构与算法】建立多个栈的三种方案的优缺点分析

在一个算法中需要建立多个栈时可以选用以下三种方案之一&#xff0c;试问这三方案相比各有什么优缺点&#xff1f; &#xff08;1&#xff09;分别用多个顺序存储空间建立多个独立的顺序栈。 &#xff08;2&#xff09;多个栈共享一个顺序存储空间。 &#xff08;3&#xff09;…...

DjangoRF-14-创建request子应用

注意&#xff0c;本应该是requests模块&#xff0c;为了区分&#xff0c;避免错误&#xff0c;用request 1、进入apps,创建request django-admin startapp request 2、因为只发送请求&#xff0c;没有数据库相关&#xff0c;不需要model。 3、进行序列化 from rest_framework …...

SOMEIP_ETS_005:检查字节序

测试目的&#xff1a; 验证DUT在发送和接收参数时对字节序的处理能力。 描述 本测试用例旨在检验DUT在处理具有不同字节序的参数时&#xff0c;是否能够正确地发送和接收数据&#xff0c;并确保返回的UINT32值是传入的两个参数&#xff08;UINT8和UINT16&#xff09;的和。 …...

为什么要对医疗器械进行网络安全评估?

对医疗器械进行网络安全评估的原因主要有以下几点&#xff1a; 一、保障患者安全 直接关联患者健康&#xff1a;医疗器械与患者的生命健康直接相关&#xff0c;任何网络安全漏洞都可能导致设备被非法控制或数据泄露&#xff0c;进而威胁患者的生命安全。例如&#xff0c;黑客可…...

沃尔玛1P账号的强悍作用重要反映在那些方面?——WAYLI威利跨境助力商家

沃尔玛作为全球最大的零售商之一&#xff0c;其品牌影响力非常强大。商家通过入驻沃尔玛商超并开设1P账号&#xff0c;能够借助沃尔玛的品牌影响力来提升自身的品牌知名度和美誉度。这种品牌背书的效应&#xff0c;有助于商家吸引更多的消费者关注和购买自己的产品。 一、沃尔玛…...