Linux中进程的控制

news2024/9/21 11:09:37

一、进程的创建

1、知识储备

进程的创建要调用系统接口,头文件 #include<unistd.h> 函数fork()

由于之前的铺垫我们现在可以更新一个概念

进程 = 内核数据结构(task_struct, mm_struct, 页表....)+ 代码 + 数据

所以如何理解进程的独立性呢?

就是上述组成进程的结构都是独立的,互不影响的。

那为什么 fork() 返回的是子进程的pid呢?

是为了让父进程对子进程进行表示和管理。

2、理解fork()

(1)fork() 常见用法

a、在一个代码中通过 fork() 不同的返回值用 if else分流,以达到不同进程执行不同代码的目的。

b、可以让父子进程独立进行完全不同的代码。

(2)fork() 失败的原因

a、操作系统中进程太多。

b、实际用户创建的进程太多,超出规定个数。

二、进程的终止

首先我们要知道进程是先创建内核数据结构,再加载代码和数据。

1、终止的表现

会释放代码和数据所占据的空间,释放内核数据结构(task_struct 会延期释放)

2、终止的三种情况

(1)观察现象

首先我们先观察一个现象

当我们以前在写c语言代码时,我们都是 return 0; 结尾,当我们今天 return 100; 时,用 echo $? 命令获取进程的退出码时,就会发现退出码和 return 后面的数字是一样的。

(2)解释 echo $?

echo:内建命令,打印bash内部变量数据。

$:访问变量内容。

?:父进程bash获取最近一个子进程的退出码。

(3)退出码

退出码0是成功,非0是失败。

每一个非0数都有不同的失败原因。

头文件 #include<string.h>    函数 char* strerror(int num) 可以查看退出码。

上图只截了一部分退出码。

退出码的作用就是告诉父进程,子进程把任务完成的怎么样。

结论:当代码跑完时,结果的正确与否是由退出码反馈给用户的。

(4)退出信号

与退出码不同,退出信号是代码还没跑完,系统就崩溃了(操作系统发现进程做了不该做的事,比如访问野指针等等),操作系统就会杀死进程。

所以一旦出现异常,退出码也就没有意义了,但是返回的退出信号是有意义的。

例如:Segmentation fault 就是段错误,代码段是有错误的。

退出信号的本质:操作系统给进程发信号并终止进程。

之前我们说kill -9 可以直接杀死进程也就是这个原因,而我们上面提到的段错误 Segmentation fault 就是操作系统发送了 kill -11 信号。

(5)总结

衡量一个进程的退出,只要看退出码和退出信号。

先确认是否异常,若不是才看退出码。

所以在子进程的 task_struct 中就会有 exit_code(退出码)  exit_signal(退出信号),在执行完代码后写入退出码和退出信号供父进程读取。

3、如何终止

(1)main()函数中的 return 代表进程终止(普通函数 return 表示函数结束)

(2)调用头文件#include<stdlib.h> 函数 void exit(int status) status相当于退出码,exit等价于return

(3)调用头文件#include<unistd.h> 函数 void _exit(int status),基本与exit函数相同,一个是c库函数,一个是系统调用。

区别

exit 执行时会冲刷缓冲区,但是 _exit不会,所以其实这里所说的缓冲区只是c库层面的,不是系统调用层面的缓冲区。

exit本质就是底层调用 _exit

三、进程等待

任何子进程在退出的情况下必须要被父进程等待。如果父进程不管,子进程就会处于僵尸状态,导致内存泄漏。

三、进程的等待

1、为什么父进程要等待子进程

(1)解决僵尸问题,回收系统资源。(必须)

(2)获取子进程退出信息,知道子进程为什么退出。(可选)

2、怎么等待

(1)wait 函数

头文件 #include<sys/types.h> #include<sys/wait.h>

函数 pid_t wait(int* status)

等待成功返回子进程的pid,wait(NULL)表示父进程等待任意一个子进程退出。

若子进程一直不退出,父进程就进入阻塞等待。

阻塞等待的本质:把父进程设为非运行状态(S),链入到子进程队列中,子进程退出,父进程唤醒。

(2)waitpid 函数

头文件 #include<sys/types.h> #include<sys/wait.h>

函数 pid_t waitpid(pid_t id, int* status, int options)

waitpid(-1, NULL, 0)等价于wait(NULL)

a、理解参数 id

id 表示要等待哪个子进程

所以理解代码:

pid_t id = fork();

waitpid(id, NULL, 0);

在父进程中fork()返回子进程pid,所以就指定了要返回哪个子进程了。

b、理解参数 status

status是输出型参数(例如 scanf(),就是把数值写入到一个变量中),输出的是退出信息(包括退出码和退出信号)

理解额代码:

我们知道int有32位bit位,status只考虑低16位

获取退出码:(status>>8) & 0xFF

获取退出信息:status & 0x7F

c、获取退出码的宏

WIFEXITED(status)     代码正常走完就返回真

WEXITSTATUS(status)    若WIFEXITED为真就提取退出码

(3)非阻塞等待

上述父进程都是等子进程跑完之后才工作的,这种都是阻塞等待,调用waitpid默认也是阻塞等待,但是我们想让父进程在等待时做其他事情,就要让 waitpid 中 option 设成 WNOHANG

此时返回值 < 0:等待失败。

返回值 = 0:检测成功,但是子进程未退出,等待下一次检测。

返回值 > 0:等待成功,并且父进程回收成功。

非阻塞等待 + 循环 = 非阻塞轮询

达到父进程能做其他事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Odoo 16 中覆盖现有控制器

Odoo 中使用控制器来开发前端模块。后端模块链接到控制器。我们可以通过使用覆盖属性对基类进行修改来修改编程逻辑或向现有程序添加新逻辑。 要将控制器添加到模块,第一步,您必须为控制器创建一个单独的目录。在此目录中,应将一个 init 文件和包含控制器方法的所有 python…

Python中发送邮件的艺术:普通邮件、PDF附件与Markdown附件

用的是qq邮箱&#xff0c;具体获取smtp的password可以看这个文章 获取密码 Python中发送邮件的艺术&#xff1a;普通邮件、PDF附件与Markdown附件 在今天的博客中&#xff0c;我们将探讨如何使用Python的smtplib库来发送电子邮件&#xff0c;包括发送普通文本邮件、携带PDF文件…

初学 Linux 必知必会的 X 个知识点

文章目录 一、Linux 系统与 Windows 系统的差别二、Linux 命令行初识1. 终端界面2. 路径的含义3. 命令结构说明4. 常见的 Linux 命令4-1. 文件和目录操作4-2. 网络相关命令 5. 使用命令行时的小技巧5-1. 使用 TAB 键补全5-2. 巧用通配符 *5-3. 命令行历史功能 三、文件的详细信…

代码:前端与数据库交互的登陆界面

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>登录</title> </head> <body>…

flutter 充电气泡

前言&#xff1a; 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移&#xff0c; 然后和上面的圆圈 会和&#xff0c;感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下&#xff0c;而且气泡 和 气泡直接还可以粘黏 实现原理&#xff…

U盘数据误删如何恢复?

问&#xff1a;U盘数据误删如何恢复&#xff1f; 答&#xff1a; 1.若出现U盘中的文件被误删后第一步&#xff1a;不进行任何写入操作&#xff08;向U盘中复制或移动文件&#xff09;&#xff0c; 接着直接拔掉U盘。 2.在电脑上下载数据恢复软件&#xff0c;给大家推荐一个数据…

stm32学习:(寄存器2)GPIO总体说明

目录 GPIO的主要特点 GPIO的8种工作模式 GPIO电路结构 GPIO输出模式 输出流程 复用输出模式 GPIO输入模式 输入流程 模拟输入流程 GPIO相关的7个寄存器 GPIOx_CRL GPIOx_CRH GPIOx_IDR GPIOx_ODR GPIOx_BSRR GPIOx_BRR GPIOx_LCKR 实例 三个灯流水灯 main.…

0305-0308TTL逻辑门电路

逻辑门电路-逻辑描述中的问题 3.5TTL逻辑门电路3.5.1BJT的开关特性BJT的开关时间 3.5.2TTL反相器的基本电路1.电路组成2.TTL反相器的工作原理 3.5.3改进型TTL门电路-抗饱和TTL门电路1.抗饱和TTL门电路2.其他TTL门电路 3.7逻辑描述中的几个问题3.7.1正负逻辑问题3.7.2 基本逻辑门…

VirtualBox安装增强功能时报错:未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑

VirtualBox安装增强功能时报错&#xff1a;未能加载虚拟光盘VBoxGuestAdditions.iso 到虚拟电脑 选中一个虚拟机 进入设置点击存储 再点击光盘样子的加号进入后就可以选择 添加 选中双击就好&#xff0c;我已经添加过了 所以我的会在上面 选中一个虚拟机 进入设置 点击存储 再点…

基于单片机的智能窗帘系统设计

【 摘 要 】 随着物联网技术的发展,智能家居越来越受到业界的关注,针对目前市场上智能窗帘的弊端,设计了一款基于单片机的智能窗帘 。 普遍窗帘需要手工进行控制,遥控窗帘通常需要远程控制,智能窗帘与之相比,可以实现自主控制。 系统前端探测器采用光敏传感器,对光线进行…

小程序中视频课程下载工具使用教程,一键下载小程序中的视频课程!

前言&#xff1a; 现代随着知识付费时代的发展&#xff0c;我们很多视频课程或需要学习的资料是保存在小程序当中的&#xff0c;但是现在很多小程序它是禁止让我们下载我们所观看到的视频课程的&#xff0c;这就给我们带来了很多不方便。今天我就教大家如何一键下载小程序中的…

python实现图像对比度增强算法

python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…

德国汉堡大学、清华大学联合英国布里斯托机器人实验室的研究工作分享:基于视觉遥操作的多指机械手灵巧操作

德国汉堡大学&#xff08;张建伟院士团队&#xff09;、清华大学&#xff08;孙富春教授和方斌&#xff09;联合英国布里斯托机器人实验室等单位在基于视觉信息遥操作的多指机械手灵巧操作研究方面取得进展。该工作得到了德国科学基金会&#xff08;DFG&#xff09;与中国国家自…

C++合作开发项目:美术馆1.0

快乐星空MakerZINCFFO 合作入口&#xff1a;CM工作室 效果图&#xff1a; 代码&#xff1a; &#xff08;还有几个音乐&#xff01;&#xff09; main.cpp #include <bits/stdc.h> #include <windows.h> #include <conio.h> #include <time.h> #in…

E16.【C语言】练习:输入一个正的整数,逆序打印这个整数的每一位

输入一个正的整数&#xff0c;逆序打印这个整数的每一位 输入&#xff1a;123 输出&#xff1a;321 步骤&#xff1a;1.取出整数的每一位 2.倒序打印 分析&#xff1a;123%103-->123/1012(3被去除了)-->12%102-->12/101(2被去除了)-->1%101(取出最后一位)->…

Michael.W基于Foundry精读Openzeppelin第66期——ProxyAdmin.sol

Michael.W基于Foundry精读Openzeppelin第66期——ProxyAdmin.sol 0. 版本0.1 ProxyAdmin.sol 1. 目标合约2. 代码精读2.1 getProxyImplementation(ITransparentUpgradeableProxy proxy)2.2 getProxyAdmin(ITransparentUpgradeableProxy proxy) && changeProxyAdmin(ITr…

【计算机网络】0 课程主要内容(自顶向下方法,中科大郑烇、杨坚)(待)

1 教学目标 掌握计算机网络 基本概念 工作原理 常用技术 为将来学习、应用和研究计算机网络打下坚实基础 2 课程主要内容 1 计算机网络和互联网2 应用层3 传输层4 网络层&#xff1a;数据平面5 网络层&#xff1a;控制平面6 数据链路层和局域网7 网络安全8 无线和移动网络9 多…

C2W1.LAB.Vocabulary Creation+Candidates from String Edits

理论课&#xff1a;C2W1.Auto-correct 文章目录 Vocabulary CreationImports and DataPreprocessingCreate Vocabulary法1.集合法法2.词典加词频法Visualization Ungraded Exercise Candidates from String EditsImports and DataSplitsDelete Edit Ungraded Exercise 理论课&…