在unix高级系统编程一书中:
在说明f o r k函数时,一定是一个父进程生成一个子进程。上面又说明了子进程将其终止状
态返回给父进程。但是如果父进程在子进程之前终止,则将如何呢?其回答是对于其父进程已
经终止的所有进程,它们的父进程都改变为i n i t进程。我们称这些进程由i n i t进程领养。其操作
过程大致是:在一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止的进
程的子进程,如果是,则该进程的父进程I D就更改为1 ( i n i t进程的I D )。这种处理方法保证了每
个进程有一个父进程。
在U N I X术语中,一个已经终止、但是其父进程尚未
对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称为僵死
进程( z o m b i e)。p s ( 1 )命令将僵死进程的状态打印为Z。如果编写一个长期运行的程序,它
f o r k了很多子进程,那么除非父进程等待取得子进程的终止状态,否则这些子进程就会变成僵
死进程。
一个父进程已终止的进程称为孤儿进程(orphan process),这种进程由i n i t进程收养。
之前觉得僵尸进程和孤儿进程关系不大,最近看了深入理解linux内核一书才明白其实关系比较大。
when a process terminates, the kernal changes the appropriate process descriptor pointers of all the existing chrildren of the terminated process to make them become children of init. This process monitors the execution of all it's children and routinely issues wait4() system calls, whose side effect is to get rid of all orphaned zombies.
这段是书中第一章关于僵死进程的介绍,中文版把side effect翻译成副作用,让我费解了一阵,感觉翻译成另一个作用更合适些。书中还有更详细的介绍。
下面是进程的状态的一个叙述
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:(ps -elf可以看到s列,ps aux可以看到stat列)
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix