int pstat_getproc(
struct pst_status buf , <== 进程状态
size_t elemsize,
size_t elemcount,
int index
);
将elemcount设置为0 并且将index 设置为该进程的PID ,来获取单个进程的信息。
buf->pst_stat 就是进程状态利用命令ps,可以看到有标记为Z的进程就是僵尸进程。
显示Zombie状态进程
ps -eo state,pid,cmd | grep '^Z'
进程状态主要有:
R(运行中)
S(睡眠中,可中断)
D(睡眠中,不可中断)
T(暂停或被追踪)
X( 已退出,即将被销毁)
Z(已退出,成为僵尸进程)
p
s列出的进程状态在S那一栏,ps的用法详见man手册
怎样来清除僵尸进程:
1改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
2把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程它产生的所有僵尸进程也跟着消失。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)