Linux 多进程编程 I

进程的状态

Linux进程有7种基础状态(两种running算一种),除了traced都可以用$ps命令查看,$ps可以查看的进程状态如下:
R running or runnable (on run queue)
D uninterruptible sleep (usually IO)
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.

说到进程的状态, 开发过程中最关心的就是两个特殊的状态: 僵尸进程孤儿进程

Orphan Process:一个parent退出,而它的一个或多个child还在运行,那么这些child将成为orphan。将被init(PID==1)收养,并由init对它们完成状态收集工作。init会循环地wait()直到这些child完成了他们的工作. 即当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

Zombie Process: 一个使用fork()创建的child,如果child退出,而parent并没有调用wait/waitpid获取child的状态信息,那么child的process descriptor、PID和PCB等资源仍然保存在系统中。此时的child就变成了zombie。因为系统的PID总数是有限的, parent不断的创建child而不去wait,系统早晚会被拖垮.

简而言之:
Orphan/Zombie都是因为在parent中没有wait掉child, 不同之处是orphan的parent已经没了, 由init来接管了,而zombie有个缺德的parent, 不wait还不撒手,拖累了系统. $ps 一下Zombie的进程状态是’Z’

代码模型

#include <sys/types.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
getpid()/getuid()/getgid()                  //获得PID/UID/GID
fork()/vfork()                              //创建子进程
exec() family                               //替代子进程
atexit()/on_exit()/exit()/_exit()/_Exit()   //退出子进程
wait()/waitpid()                            //获得子进程退出状态

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.