Linux—进程状态
目录
一.前言
1.1.通过系统调用获取进程标示符
1.2.通过系统调用创建进程
二.进程状态
三.Z(zombie)-僵尸进程
四.僵尸进程危害
一.前言
学习进程的状态,我们首先了解一下进程的基本数据
1.1.通过系统调用获取进程标示符
由getpid()函数调用获取进程id
由getppid()函数调用获取父进程id
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
1.2.通过系统调用创建进程
我们通过 fork()函数来创建进程
fork有俩个返回值(父进程返回创建子进程的进程ID;在子进程中,fork返回0,如果出现错误,返回负值 )
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
fork 之后通常要用 if 进行分流
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}

二.进程状态
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
下面的状态在kernel源代码里定义:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
通过下面代码查看a.out 里面的进程状态
while :; do ps aux | grep a.out | grep -v grep ; sleep 2; echo "*****" ; done

三.Z(zombie)-僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
创建一个维持30秒的僵尸进程例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id > 0){ //parent
printf("parent[%d] is sleeping...\n", getpid());
sleep(30);
}else{printf("child[%d] is begin Z...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0 ;
}

四.僵尸进程危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说, Z状态一直不退出, PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
内存泄漏?是的!
相关文章:
Linux—进程状态
目录 一.前言 1.1.通过系统调用获取进程标示符 1.2.通过系统调用创建进程 二.进程状态 三.Z(zombie)-僵尸进程 四.僵尸进程危害 一.前言 学习进程的状态,我们首先了解一下进程的基本数据 1.1.通过系统调用获取进程标示符 由getpid()…...
万宾科技可燃气体监测仪科技作用全览
燃气管网在运行过程中经常会遇到燃气管道泄漏的问题,燃气泄漏甚至会引起爆炸,从而威胁人民的生命和财产安全,因此对燃气管网进行定期巡检是十分必要的工作。但是传统的人工巡检已不能满足城市的需要,除了选择增加巡检人员之外&…...
Python与GPU编程快速入门(三)
3、使用Numba加速Python代码 Numba 是一个 Python 库,它使用行业标准 LLVM 编译器库在运行时将 Python 函数转换为优化的机器代码。 您可能想尝试用它来加速 CPU 上的代码。 然而,Numba还可以将Python 语言的子集转换为CUDA,这就是我们将在这里使用的。 所以我们的想法是,…...
praseInt 和 逻辑或连用
这是做项目时遇到json文件转换 的一个小坑 将json 对象中的值 由字符串(数字字符串) 转换为 数值类型,如果是 转换失败 ,就返回 -1 这里的 parseInt 看起来非常简洁,但是存在一个小坑 transformedData[fieldsToCheck[i]] parseInt(origina…...
对属于国家秘密的地理信息的获取、持有、提供、利用情况进行登记并长期保存,实行可追溯管理
对属于国家秘密的地理信息的获取、持有、提供、利用情况进行登记并长期保存,实行可追溯管理 数据记录(包括获取、持有、提供、利用、销毁等全闭环)...
XAER_RMERR: Fatal error occurred in the transaction branch异常解决
XAER_RMERR: Fatal error occurred in the transaction branch异常解决 数据库权限问题!!!不是mysql驱动问题,执行下面命令解决 GRANT XA_RECOVER_ADMIN ON *.* TO root% ;...
Redis面试常见问题
Redis中的Lua脚本到底能不能保证原子性? Redis中Lua脚本的执行,可以保证并发编程中不可再拆分的这个原子性,但是没有保证数据库ACID中要么都执行要么都回滚的这个原子性。Lua脚本执行过程中命令产生错误,是不会回滚的,…...
浏览器触发下载Excel文件-Java实现
目录 1:引入maven 2:代码实现 3.导出通讯录信息到Excel文件 4.生成并下载Excel文件部分解释 1:引入maven 添加依赖:首先,在你的项目中添加EasyExcel库的依赖。你可以在项目的构建文件(如Maven的pom.xml)中添加以下依赖项:<dependency><groupId>com.alib…...
每日汇评:黄金在上涨趋势恢复之前面临修正性回调的风险
周三早些时候,金价触及六个月来的最高水平,接近 2050 美元; 在美联储转向鸽派立场后,美元和美债双双下跌; 日线图上的超买RSI指标警示多头,但即将到来的金十字图形使上行保持不变; 金价在周三亚…...
【开源】基于Vue.js的大学计算机课程管理平台的设计和实现
项目编号: S 028 ,文末获取源码。 \color{red}{项目编号:S028,文末获取源码。} 项目编号:S028,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2…...
c++环形队列
c环形队列 c环形队列 c环形队列 #pragma once#include <iostream> #include <vector>/// <summary> /// - 环形队列 /// - 不是线程安全 /// </summary> /// <typeparam name"T"></typeparam> template <typename T> cla…...
智能客服核心技术——预测会话与答案生成
1.信息检索 2. 句型模板匹配标准问题生成答案 3.根据知识图谱推理得到答案...
C语言——计算Fibonacci数列
方式一 for循环 (20位) #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int a[20]{1,1};for ( n 1; n <20; n){a[n]a[n-2]a[n-1];}for ( n 0; n < 20; n){if(n%50)printf("\n");printf("%12d ",a[n]);}return 0; …...
【ASP.NET CORE】.NET 6.0 NET CORE MVC连接SQLSERVER数据库
项目装NuGet包,具体版本如下 在appsettings.json中,添加连接字符串 代码如下: "ConnectionStrings": {"MVCSqlContext": "Serverlocalhost;DatabaseAddress;User IDsa;Passwordsa;TrustServerCertificatetrue&q…...
filebeat日志收集工具
1、优缺点 filebeat收集的数据可以发往多个主机,即远程收集 filebeat无法实现数据过滤,一般结合logstash的数据过滤一块使用 2、远程收集多主机的日志实验 实验目的:一体化查看日志 实验条件: 主机名 服务器 IP地址 组件 …...
一文例说嵌入式 C 程序的内聚和耦合
1 - 原理篇 低耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。这样,高内聚从整个程序中每一个模块的内部特征角度,低耦合从程序中各个模块之间的关联关系…...
python-爬虫(可直接使用)
爬虫(Web Scraping)是指通过编程自动化地获取互联网上的信息的过程。爬虫的目的通常是从网页中抓取数据,进行数据分析、处理或展示。以下是爬虫的基本流程和一些重要的概念: 爬虫基本流程: 确定目标: 确定要…...
Moonbeam生态项目分析 — — 去中心化交易所Beamswap
流动性激励计划Moonbeam Ignite是帮助用户轻松愉快体验Moonbeam生态的趣味活动。在Moonbeam跨链连接的推动下,DeFi的各种可能性在这里爆发。DeFi或许不热门,但总有机会捡漏,了解Monbeam生态项目,我们邀请Moonbeam大使分享他们的研…...
自研Xilinx高性能PCIe多通道DMA控制器
1 介绍 基于PCI Express Integrated Block,Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous或Scather Gather DMA,提供FIFO/AXI4-Stream用户接口。 基于PCI Express Integrated Block,Multi-Channel…...
人工智能原理复习--知识表示(二)
文章目录 上一篇产生式表示法推理方式 结构化表示语义网络语义网络表示知识的方法和步骤应用题目 框架表示法下一篇 上一篇 人工智能原理复习–知识表示(一) 产生式表示法 把推理和行为的过程用产生式规则表示,所以又称基于规则的系统。 产…...
OpenClaw 核心概念关系与配置指南
文章目录🏗️ 一、核心概念关系图🔄 二、核心概念关系详解1. Gateway(网关)- 控制中枢2. Agent(智能体)- 执行单元3. Skills(技能)- 功能模块4. Tools(工具)-…...
Kylin V10系统下KVM虚拟化实战:从环境配置到虚拟机部署
1. Kylin V10系统与KVM虚拟化基础 国产麒麟操作系统V10作为一款基于Linux内核的自主可控系统,在企业级应用中越来越常见。最近我在一个国产化服务器迁移项目中,需要在Kylin V10上部署KVM虚拟化环境,过程中积累了不少实战经验。KVM作为Linux内…...
企业微信外部群自动化回复避坑指南:RPA如何稳定接管WebSocket连接不断线
企业微信外部群自动化回复的WebSocket稳定性实战:从心跳包到风控规避 当你的RPA机器人第三次在凌晨2点因为WebSocket连接断开而停止响应时,技术负责人发来的质问消息比企业微信的报警通知更让人心惊。这不是简单的技术故障,而是关乎业务流程连…...
Lingyuxiu MXJ LoRA深度学习优化:训练加速技巧
Lingyuxiu MXJ LoRA深度学习优化:训练加速技巧 深度学习训练往往需要大量时间和计算资源,但通过一些巧妙的优化技巧,我们可以显著提升训练效率。本文将分享针对Lingyuxiu MXJ LoRA模型的训练加速方法,让你用更少的时间获得更好的效…...
手把手教你用Vivado为Microblaze软核搭建Linux最小系统(含DDR3、UART、以太网配置)
从零构建Microblaze软核Linux硬件系统:Vivado实战指南 在FPGA上运行Linux系统一直是嵌入式开发者的进阶挑战,而Xilinx的Microblaze软核处理器为这一目标提供了灵活高效的解决方案。不同于传统ARM架构的固定硬件,Microblaze允许开发者根据项目…...
多租户下的系统业务开发过程探讨贝
一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...
关于 SSR,我承认我之前只是“会用”而已
SSR、Hydration 这些词在 Web 前端领域非常常见,开发者经常能接触到这个概念。但是,这些是什么?为什么?怎么用?过去我都没有深究下去,关于 SSR,我承认我之前只是“会用”而已。 一、区分 CSR 还…...
百度百舸 x 昆仑芯,加速 GLM-5.1 从开源发布到规模化应用
今日,智谱正式开源新一代大模型 GLM 5.1。作为智谱 GLM 系列的最新力作,GLM-5.1 的整体能力得到了全面提升。尤其在代码能力上:在最接近真实软件开发的 SWE-bench Pro 基准测试中,GLM-5.1 超过 GPT-5.4、Claude Opus 4.6ÿ…...
3. 函数新增了哪些扩展?
一、先给一个面试开场思路如果面试官问:ES6 对函数新增了哪些扩展?不要一上来就堆概念。 比较好的回答方式是先分类:ES6 对函数的扩展,我一般会从 参数、作用域、函数写法、this 绑定、尾调用、函数名、rest/spread 这几个方面来说…...
qtCreator应用程序输出窗口qDebug不输出问题
可以通过配置环境变量export QT_LOGGING_RULES"*.debugtrue;qt.*.debugfalse"...
