标题:
孤儿进程与僵尸进程(3)
[打印本页]
作者:
yuyang911220
时间:
2017-1-16 23:03
标题:
孤儿进程与僵尸进程(3)
程序测试结果如下所示:
4、僵尸进程解决办法
(1)通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。测试程序如下所示:
[url=]
[/url]
1
#include <stdio.h>
2
#include <unistd.h>
3
#include <errno.h>
4
#include <stdlib.h>
5
#include <signal.h>
6
7
static
void
sig_child(
int
signo);
8
9
int
main()
10
{
11
pid_t pid;
12
//
创建捕捉子进程退出信号
13
signal(SIGCHLD,sig_child);
14
pid =
fork();
15
if
(pid <
0
)
16
{
17
perror(
"
fork error:
"
);
18
exit(
1
);
19
}
20
else
if
(pid ==
0
)
21
{
22
printf(
"
I am child process,pid id %d.I am exiting.\n
"
,getpid());
23
exit(
0
);
24
}
25
printf(
"
I am father process.I will sleep two seconds\n
"
);
26
//
等待子进程先退出
27
sleep(
2
);
28
//
输出进程信息
29
system(
"
ps -o pid,ppid,state,tty,command
"
);
30
printf(
"
father process is exiting.\n
"
);
31
return
0
;
32
}
33
34
static
void
sig_child(
int
signo)
35
{
36
pid_t pid;
37
int
stat;
38
//
处理僵尸进程
39
while
((pid = waitpid(-
1
, &stat, WNOHANG)) >
0
)
40
printf(
"
child %d terminated.\n
"
, pid);
41
}[url=]
[/url]
测试结果如下所示:
(2)fork两次
《Unix 环境高级编程》8.6节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。测试程序如下所示:
[url=]
[/url]
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4
#include <errno.h>
5
6
int
main()
7
{
8
pid_t pid;
9
//
创建第一个子进程
10
pid =
fork();
11
if
(pid <
0
)
12
{
13
perror(
"
fork error:
"
);
14
exit(
1
);
15
}
16
//
第一个子进程
17
else
if
(pid ==
0
)
18
{
19
//
子进程再创建子进程
20
printf(
"
I am the first child process.pid:%d\tppid:%d\n
"
,getpid(),getppid());
21
pid =
fork();
22
if
(pid <
0
)
23
{
24
perror(
"
fork error:
"
);
25
exit(
1
);
26
}
27
//
第一个子进程退出
28
else
if
(pid >
0
)
29
{
30
printf(
"
first procee is exited.\n
"
);
31
exit(
0
);
32
}
33
//
第二个子进程
34
//
睡眠3s保证第一个子进程退出,这样第二个子进程的父亲就是init进程里
35
sleep(
3
);
36
printf(
"
I am the second child process.pid: %d\tppid:%d\n
"
,getpid(),getppid());
37
exit(
0
);
38
}
39
//
父进程处理第一个子进程退出
40
if
(waitpid(pid, NULL,
0
) !=
pid)
41
{
42
perror(
"
waitepid error:
"
);
43
exit(
1
);
44
}
45
exit(
0
);
46
return
0
;
47
}[url=]
[/url]
测试结果如下图所示:
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0