僵死进程和孤儿进程

来源:互联网 发布:game center数据删除 编辑:程序博客网 时间:2024/06/05 22:40

环境:Vmware Workstation;CentOS-6.4-x86_64

程序要求:

编写一个孤儿进程,这个孤儿进程可以创建100个僵死进程。

分析:

1、首先在一个进程中fork,创建两个完全一样的进程。

2、退出父进程,使子进程成为孤儿进程。

3、在孤儿进程中循环创建进程,并结束孙子进程,使子进程成为僵死进程。

实现步骤:

1、创建并编辑源文件main.c:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <unistd.h>int main(int argc, char *args[]){// 在程序中fork,创建两个一样的进程pid_t id = fork();// 判断fork是否成功if (id == -1){// 输出出错信息printf("fork failed : %s\n", strerror(errno));}// 结束父进程,使子进程成为孤儿进程if (id > 0){exit(0);}// 执行子进程的代码else{// 创建循环变量int i = 0;for(; i < 100; i++){// fork产生孙子进程pid_t temp_id = fork();// 判断fork是否成功if (temp_id == -1){// 输出出错信息printf("fork failed : %s\n", strerror(errno));}// 执行孙子进程的内容if (temp_id == 0){// 退出孙子进程,使子进程成为僵死进程exit(0);}}// 在子进程退出之前,让其暂停// 否则,子进程退出的话,僵死进程和孤儿进程也就没法实现了pause();}return 0;}

2、创建并编辑文件makefile:

.SUFFIXES:.c .oCC=gccSRCS=main.cOBJS=$(SRCS:.c=.o)EXEC=mainstart: $(OBJS)$(CC) -o $(EXEC) $(OBJS)@echo "-----------------------------OK-----------------------".c.o:$(CC) -Wall -o $@ -c $<clean:rm -rf $(EXEC) $(OBJS)

3、编译并执行程序:

[negivup@negivup mycode]$ makegcc -Wall -o main.o -c main.cgcc -o main main.o-----------------------------OK-----------------------[negivup@negivup mycode]$ ./main

4、查看进程信息:

[negivup@negivup ~]$ ps -auxnegivup  16249  0.0  0.0   3916   136 pts/1    S    19:21   0:00 main                  根据这个号杀死进程negivup  16250  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16251  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16252  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16253  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16254  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16255  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>negivup  16256  0.0  0.0      0     0 pts/1    Z    19:21   0:00 [main] <defunct>......
可以看出,已死进程刚好100个,也就是说,僵死进程有100个。

5、回收僵死进程以及孤儿进程:

[negivup@negivup ~]$ kill 16429            杀死进程negivup   4997  0.0  0.0  97860  1792 ?        S    08:16   0:02 sshd: negivup@pts/negivup   5701  0.0  0.1 108440  1916 pts/1    Ss+  09:10   0:00 -bashnegivup  14849  0.0  0.0 108328  1864 pts/0    Ss   18:03   0:00 -bashpostfix  14916  0.0  0.1  78800  3252 ?        S    18:07   0:00 pickup -l -t fiforoot     16365  0.0  0.0 100900   564 ?        S    19:22   0:00 sleep 60negivup  16367  2.0  0.0 110232  1144 pts/0    R+   19:23   0:00 ps -aux
会发现,程序中没有僵死进程了。


PS:根据传智播客视频学习整理得出。

0 0
原创粉丝点击