环境:Vmware Workstation;CentOS-6.4-x86_64
程序要求:
编写一个孤儿进程,这个孤儿进程可以创建100个僵死进程。
分析:
1、首先在一个进程中fork,创建两个完全一样的进程。
2、退出父进程,使子进程成为孤儿进程。
3、在孤儿进程中循环创建进程,并结束孙子进程,使子进程成为僵死进程。
实现步骤:
1、创建并编辑源文件main.c:
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 .o
CC=gcc
SRCS=main.c
OBJS=$(SRCS:.c=.o)
EXEC=main
start: $(OBJS)
$(CC) -o $(EXEC) $(OBJS)
@echo "-----------------------------OK-----------------------"
.c.o:
$(CC) -Wall -o $@ -c $<
clean:
rm -rf $(EXEC) $(OBJS)
3、编译并执行程序:
[negivup@negivup mycode]$ make
gcc -Wall -o main.o -c main.c
gcc -o main main.o
-----------------------------OK-----------------------
[negivup@negivup mycode]$ ./main
4、查看进程信息:
[negivup@negivup ~]$ ps -aux
negivup 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 -bash
negivup 14849 0.0 0.0 108328 1864 pts/0 Ss 18:03 0:00 -bash
postfix 14916 0.0 0.1 78800 3252 ? S 18:07 0:00 pickup -l -t fifo
root 16365 0.0 0.0 100900 564 ? S 19:22 0:00 sleep 60
negivup 16367 2.0 0.0 110232 1144 pts/0 R+ 19:23 0:00 ps -aux
会发现,程序中没有僵死进程了。