僵死进程和孤儿进程

环境: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 .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
会发现,程序中没有僵死进程了。


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章