Linux进程

article/2025/6/27 11:39:10

进程概念

获取进程pid方式(概念)

1.获取所有的pid信息

部分获取ps ajx | head -1 && ps axj | grep 文件名

ps ajx | head -1 && ps axj | grep 文件名 | grep -v grep可以过滤掉grep中携带进程部分信息的内容

因为我没有运行test.o所以未开辟进程,所以没有进程信息

ps ajx | grep 文件名

2.示例代码

每个进程都有属于自己的PID(身份码)

在Linux系统里,PID即“Process IDentifier”,是进程标识符 ,以下是详细介绍:
 
基本概念

PID是系统为每个进程分配的独一无二的非负整数 。每个进程从创建起就被赋予特定PID,借此在系统中被唯一标识。就像现实中每辆车都有独特车牌号,方便交通管理,PID便于操作系统对进程进行管理和区分。

作用
 
- 进程管理:是进程的身份标识。系统借助PID识别、跟踪、控制进程,如使用  kill  命令通过指定PID向进程发送信号,实现进程终止(如  kill -9 <PID>  可强制终止进程 ); waitpid  函数能让父进程等待特定子进程结束 。

- 资源分配与调度:操作系统依据PID管理进程资源分配,决定CPU时间、内存等资源如何分配给各进程,保障系统高效稳定运行 。

- 进程间通信:进程可利用PID识别通信对象,实现进程间通信和同步协作 。

回顾上文我们简单的了解了进程,首先介绍的是fork.

在Linux中, fork  是一个用于创建新进程的系统调用函数 ,它在Unix和类Unix操作系统中被广泛使用。以下是关于它的详细介绍:
 
函数原型与头文件
 
- 原型: pid_t fork(void);  , pid_t  实质是  int  ,在  <sys/types.h>  中定义 。
- 头文件:使用时需包含  <unistd.h>  ,有时也会用到  <sys/types.h>  。
 
工作原理
 
调用  fork  时,系统会创建一个与调用进程(父进程)几乎完全相同的新进程(子进程)。具体过程如下:
 
1. 资源分配:系统为新进程分配资源,如存储数据和代码的空间。
2. 数据复制:将父进程的很多属性复制到子进程,包括数据空间、堆、栈等资源的副本,但父子进程并不共享这些存储空间 。不过,代码段是共享的,即父子进程从  fork  函数调用之后的下一条指令开始执行。


 
返回值特点
 
 fork  调用一次却返回两次,在不同进程中有不同返回值:
 
- 在父进程中:返回新创建子进程的进程ID(PID),是一个大于0的整数 。通过这个返回值,父进程能识别并后续操作子进程。
- 在子进程中:返回值为0 。子进程可据此判断自身身份。
- 出错时:返回 -1 ,可能原因有当前进程数达到系统上限( errno  设为  EAGAIN  ) 或系统内存不足( errno  设为  ENOMEM  )。
 
 
在上述代码中,执行  fork  后产生父子进程。子进程中  fpid  为0,打印子进程相关信息;父进程中  fpid  是子进程PID,打印父进程及子进程PID信息 。
 
应用场景
 
- 多进程并发服务器:有客户端连接时,父进程用  fork  创建子进程处理请求,自身继续监听新连接,提升并发处理能力 。
- 任务并行处理:将不同任务分发给子进程并行执行,加快任务完成速度,比如批量文件处理等场景 。


 提出以下问题
 
1. 为什么 fork 要给子进程返回0,给父进程返回子进程 pid 
 
- 子进程返回0:子进程通过返回0能方便地知道自己是子进程,因为0是一个特殊值,与任何有效的进程ID都不同。这样子进程可以在后续代码中根据这个返回值来执行特定于子进程的逻辑。
- 父进程返回子进程 pid :父进程得到子进程的 pid 后,就可以通过这个 pid 来对特定的子进程进行管理和控制,比如等待子进程结束、向子进程发送信号等。同时,父进程可以同时创建多个子进程,通过不同的 pid 来区分和处理各个子进程。
 
2. 一个函数是如何做到返回两次的
 
 fork 函数会创建一个新的进程,即子进程。子进程是父进程的一个副本,它从 fork 函数调用处开始执行,就好像是父进程的一个“分身”。在 fork 函数执行时,内核会为子进程分配资源,并复制父进程的上下文,包括程序计数器、寄存器等。因此,看起来 fork 函数在父进程和子进程中都被执行了一次,也就有了两次返回。一次是在父进程中继续执行,返回子进程的 pid ;另一次是在子进程中执行,返回0。

二者返回存在顺序问题,我们无法表象过去,个人认为父进程优先于子进程返回,因此先输出父进程内容,后输出子进程内容。
 
3. 一个变量怎么会有不同的内容?如何理解?
 
在 fork 之后,父进程和子进程拥有各自独立的地址空间。虽然它们在 fork 之前的变量值是相同的,但 fork 之后,对一个进程中变量的修改不会影响到另一个进程中的同名变量。这是因为它们的地址空间是相互独立的,每个进程都有自己的一份变量副本。例如,父进程中的一个全局变量 x ,在 fork 之后,父进程和子进程都有自己的 x ,父进程修改自己的 x 不会影响到子进程的 x ,反之亦然。


 fork 后父子进程代码共享、数据单独开辟,主要有以下原因:
 
代码共享(写时拷贝
 
- 提高内存利用效率:程序代码通常是只读的,父子进程执行相同的程序代码,若各自复制一份到内存,会浪费大量空间。共享代码段能让多个进程共用同一份代码,减少内存占用。
- 保证代码一致性:共享代码可确保父子进程执行的代码完全一致,避免因代码复制产生不一致或错误。
 
数据单独开辟
 
- 进程独立性要求:每个进程需有独立数据空间,保证其数据操作不影响其他进程。父子进程后续可能执行不同任务,对数据有不同修改需求,若数据不独立,一个进程对数据的修改会影响另一个进程,导致程序逻辑混乱。
- 数据安全与稳定:单独开辟数据空间为进程提供了安全稳定的运行环境。一个进程的数据损坏或异常不会波及其他进程,增强了系统的稳定性和可靠性。
4.  fork 函数究竟是什么,干什么
 
 fork 函数是UNIX和类UNIX系统中的一个系统调用,用于创建一个新的进程。它的主要作用是将当前进程(父进程)复制一份,生成一个新的进程(子进程)。子进程在许多方面与父进程相似,包括程序代码、数据段、堆、栈等,但它们是两个独立的进程,有各自的进程控制块(PCB)和独立的地址空间。这样,父进程和子进程可以并发执行,各自执行不同的任务,从而实现多任务处理。例如,一个服务器程序可以通过 fork 函数创建多个子进程来同时处理多个客户端的请求。

进程状态

操作系统学科进程状态(运行,阻塞,挂起)

进程状态与内存管理
 
在Linux系统中,进程状态丰富多样且与内存管理紧密相连。当进程处于阻塞状态时,往往是在等待特定事件,像从键盘读取数据。此时,进程会被挂起,其关键信息存储于 struct task_struct 结构体中。若操作系统内存资源严重匮乏,部分进程将被换出至交换分区(swap),以此节省内存,保障系统正常运转。待条件满足,比如所需数据准备就绪,进程又会被换入内存继续执行。
 
 struct task_struct 是Linux内核用于描述进程的重要结构体,涵盖进程状态、优先级等众多属性。而 struct dev 则用于描述设备,包含设备类型、状态,以及指向相关进程的指针等信息。部分设备结构体还设有等待队列,用于管理那些等待该设备资源的进程。
 
进程调度与运行
 
系统中存在一个由调度器管理的运行队列( struct runqueue ) ,该队列有指向队头和队尾进程的指针。调度器的职责是从运行队列里挑选合适的进程,使其能在CPU上运行。进程进入运行队列,意味着它已准备就绪,随时可被调度。
 
进程在CPU上并非一直运行至结束才释放资源,而是引入了时间片的概念(如图中示例的10ms )。当进程的时间片耗尽,即便尚未执行完毕,也会被调度器从CPU上移除,排至运行队列末尾,等待下一轮调度。这种频繁的进程上下操作,即进程切换,让所有进程的代码在一个时间段内都能得以执行,达成并发执行的效果。比如,即便进程遭遇 while(1); 这样的死循环代码,时间片机制也能确保其他进程有机会获得CPU调度。
 
补充完善
 
进程状态转换十分复杂,除阻塞和运行状态外,还有就绪状态、睡眠状态等。就绪状态的进程已万事俱备,只待CPU资源,一旦CPU空闲且被调度器选中,便会转入运行状态。睡眠状态又细分为可中断睡眠与不可中断睡眠,前者可被信号唤醒,后者一般在等待特定I/O操作完成后才会苏醒。
 
调度器选择进程的依据是不同的调度算法。常见的有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度等。Linux系统采用的完全公平调度器(CFS)更为复杂高效,它通过统计和比较进程的虚拟运行时间,公平分配CPU时间,防止某些进程长时间得不到调度。
 
内存管理方面,当内存资源不足时,操作系统在选择换出进程至交换分区时,会综合考量进程活跃度、内存使用量等因素。通常,不活跃进程更易被换出。进程换入内存时,需兼顾内存空间分配与进程需求,保障系统高效运行。此外,操作系统还借助页缓存等缓存机制,降低进程换入换出的性能开销,提升数据访问速度。

linux的维护方法

/*
* 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):运行中,进程正在执行或等待 CPU 资源。
- S (sleeping):睡眠状态(可中断),等待事件完成(如 I/O 操作),可被信号唤醒。
- D (disk sleep):磁盘睡眠(不可中断),等待磁盘 I/O 完成,无法被信号唤醒。
- T (stopped):停止状态,进程被暂停(如收到  SIGSTOP  信号)。
- t (tracing stop):追踪停止,因调试被追踪器暂停。
- X (dead):死亡状态,进程已终止,即将被系统移除(内核内部状态,一般不可见)。
- Z (zombie):僵尸状态,进程已结束但父进程未读取其退出状态,资源未完全释放。

 
说明:状态值为对应下标,可通过位运算判断组合状态(如  S+D  对应  1|2=3 )。

Z(zombie)-僵尸进程


僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)
没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

#include <stdio.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("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中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
内存泄漏?是的!
如何避免?后面讲
进程状态总结
至此,值得关注的进程状态全部讲解完成,下面来认识另一种进程


孤儿进程


父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,当然要有init进程回收喽。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else{//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}


http://www.hkcw.cn/article/OvrTiYbXjs.shtml

相关文章

【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件

目录 四.文件的顺序读写(续) 4.8--fwrite函数 4.9--fread函数 五.sprintf函数和sscanf函数 5.1--函数对比 5.2--sprintf函数 5.3--sscanf函数 六.文件的随机读写 6.1--fseek函数 6.2--ftell函数 6.3--rewind函数 七.文件缓冲区 7.1--fflush函数 八.更新文件 &…

铁路行业数字化应用建设方案

数字化转型面临的挑战 铁路行业正处于数字化转型的关键时期&#xff0c;铁路行业应用场景复杂&#xff0c;数据量巨大&#xff0c;传统信息化建设模式难以满足日益增长的业务需求。铁路企业亟需引入敏捷高效的数字化工具&#xff0c;加速推进业务创新&#xff0c;实现提质增效…

冬夏女王喜欢蒯铎 复杂情仇揭秘

电视剧《藏海传》中,藏海成功利用天象算计死褚怀明。事实上,褚怀明可以说是自己作死。藏海差点被褚怀明死前反击弄死,是庄芦隐冲入火场救了他。这一段剧情令人匪夷所思。事件之后,庄芦隐在藏海的劝说下,准备让庄之行参军,幻想庄家一文一武,将来可以互相扶持,重振侯府荣…

余承东称尊界订单70%百万顶配 上市1小时大定破千台

鸿蒙智行宣布尊界 S800 上市仅1小时,大定订单就突破了1000台。华为常务董事、终端BG董事长余承东透露,其中70%的订单选择了百万顶配版本。鸿蒙智行参与了2025粤港澳大湾区车展,展示了全系八大车型。展会期间,余承东与江淮汽车董事长项兴初及主持人汪涵进行了交流。此前一天…

媒体:建百万豪华公厕是政绩观扭曲 民生工程变形象工程

吉林通榆县内部装修豪华的公共厕所,每个厕所面积在110至140平方米之间,配有中央空调和排风系统、烘手器、净化开水机、自动喷香机、洗手液等多种洗漱物品,并安装了WiFi和音箱等设备。这些配置看起来更像是星级酒店的卫生间,但它们却出现在一个刚脱贫不久的县城里。日前,吉…

不演戏就“消失”的辛柏青 低调哀悼爱妻

这段时间,全网都在为朱媛媛的离世感到惋惜。她是一位德艺双馨的好人,在物欲横流的社会中显得尤为珍贵。姚晨曾评价她:“这一生虽未尽兴,却也不枉此行。”朱媛媛去世后,网友们更加心疼她的丈夫辛柏青。这对影坛伉俪在大学时一见钟情,用一袋洗衣粉定情,尽管经历了许多波折…

曾舜晞演吴老狗超级加辈 挑战与突破并存

《老九门》曾风靡一时,成为茶余饭后的热门话题。张大佛爷的戎装和二月红的痴情让无数观众津津乐道。如今,《九门》作为续篇或前传再次回归,陈伟霆再次出演佛爷,让不少老粉丝感到安心。然而,也有人担心时光流逝,陈伟霆能否再现当年的风采。毕竟,从三十而立到近不惑之年,…

香港富豪5分钟订走3台百万级豪车 尊界S800震撼上市

尊界 S800 将于本周五晚正式上市,成为鸿蒙智行迄今为止最昂贵的单品,再次刷新国产豪车的定价高度。众多提前体验过 S800 的博主对其评价极高,知名车评人陈震甚至认为其动态感受足以与劳斯莱斯闪灵相媲美。从目前亮相的情况来看,S800 多以双拼色外观呈现,也曾推出过纯黑色版…

网传马筱梅带小玥儿过端午节 母女情深逛街被偶遇

汪小菲和马筱梅结婚后,两人没有选择度假,而是继续忙于工作。婚礼当天,两个孩子没有出席,可能是出于保护他们隐私的考虑。汪小菲和马筱梅都是再婚,这次婚礼规模较小,没有邀请太多明星。不过,汪小菲还是为马筱梅举办了一个创意十足的婚礼,在四合院里举行了中式和西式典礼…

女装抄不动了 但这是好事 品质升级成新出路

中国服饰行业规模庞大,女装领域尤其复杂。时尚消费本应带来愉悦体验,但如今消费者常抱怨货不对版,衣服难买,审美趋向单一。商家也面临退货率高、生存艰难等问题。一位年销售额过亿的女装商家感叹,赚钱变得异常辛苦。女装电商的退货率持续攀升,头部商家关店跑路的消息频出…

专家谈普京会见安倍晋三的夫人 非官方访问引关注

俄罗斯总统普京于5月29日在莫斯科会见了已故日本前首相安倍晋三的遗孀安倍昭惠。会谈开始时,普京向安倍昭惠送上一束鲜花,安倍昭惠在会谈过程中哽咽落泪。日本内阁官房长官林芳正在记者会上表示,日本政府并未与安倍昭惠就此行有过事先沟通,并称政府对此行不予置评。克里姆林…

苏州金鸡湖龙舟赛开赛 精彩赛事吸引众多市民观战

5月31日上午8时许,2025苏州金鸡湖端午龙舟赛在金鸡湖畔热烈开赛。现场观赛区挤满了前来观赛的市民。据官方消息,今年参赛队伍共69支,分为竞赛组和邀请组两大类别,参赛运动员总数达1502人。上午10时左右,有参赛队伍的船只发生偏向并与其他队伍相撞,导致船上选手落水。社交…

Glide NoResultEncoderAvailableException异常解决

首先将解决方法提出来&#xff1a;缓存策略DiskCacheStrategy.DATA。 使用Glide加载图片&#xff0c;版本是4.15.0&#xff0c;有天发现无法显示gif图片&#xff0c;原始代码如下&#xff1a; Glide.with(context).load(本地资源路径).diskCacheStrategy(DiskCacheStrategy.A…

上海乐高乐园迎首批内测游客 亲子家庭欢乐启程

5月31日是端午佳节的第一天,也是上海乐高乐园度假区开园倒计时35天。当天上午10时,首批游客走进园区,中国首座乐高乐园正式分阶段开启内部测试和试运营,全面进入“测试模式”。8岁的刘星羽兴奋地说:“里面每个项目我都想玩,盼了好久了。”参加首日内测的主要是乐高员工以…

苏炳添跨界参加龙船竞渡 水上激情对决

第七届海珠湿地龙船景活动吸引了40多支村社龙舟队齐聚海珠湿地提前“热身”,苏炳添跨界参与。作为活动主场地的海珠湿地,地理位置得天独厚,39条河涌与珠江相通,水域面积达380公顷,为龙舟队提供了绝佳的探亲环境。5月30日上午,石榴岗河段迎来近40个村社的龙舟队,包括龙潭…

最严控烟令出台10年 吸烟者少了么 成效显著健康改善

《北京市控制吸烟条例》自2015年6月实施以来,被称为“史上最严”的控烟法规。根据数据模型测算,该条例实施十年来,共避免了56554例急性心肌梗死、422355例慢性阻塞性肺病以及2398例儿童哮喘住院。北京市最新的戒烟人数比十年前增加了一倍,全市规范化戒烟门诊也增加到20家,…

陈妤颉亚锦赛女子200米夺冠 刷新个人最佳

北京时间5月31日,2025亚洲田径锦标赛继续进行。在女子200米决赛中,16岁的陈妤颉以22秒97的成绩夺冠,刷新了个人最好成绩。中国选手李玉婷也表现出色,以23秒23的成绩获得第三名。责任编辑:zhangxiaohua

如何掐灭人生的第一口烟 拒绝烟草诱惑

武汉市中法生态城第二初级中学的刘同学在参加完科普学习后感慨地说:“坚决拒吸第一支烟,要做不吸烟的新一代!”每年5月31日是世界无烟日,2025年的主题为“拒绝烟草诱惑,对第一支烟说不”。据统计,全球每6秒钟有一人死于与吸烟相关的疾病,现在吸烟者中有半数将因吸烟而提…

VirtualBox 7.1.8 官方安装包 下载

VirtualBox 是一款开源虚拟机软件。 VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c; 使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。 Innotek 以 GNU General Public License (GPL) 释出 V…

专家呼吁:二手烟危害不容忽视,被动吸烟风险高

吸烟是公认的肺癌头号诱因。然而,面对戒烟劝导时,不少长期吸烟者常以“抽了十几年,不也没得肺癌?”作为辩解。那么,吸烟与肺癌之间究竟存在怎样的必然联系?为何部分长期吸烟者却能幸免?长期暴露于二手烟环境是否同样致癌?5月31日是第38个世界无烟日,为了更好地普及戒烟…