
或者在子进程中注册一个信号响应,响应动作为退出进程,然后在父进程要退出时,给子进程发送信号,然后等待子进程退出后收尸。
相关API:
wait( )
signal( )
exit( )
父进程退出前,使用 kill 向子进程发送 SIGKILL 信号。12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid
pid = fork()
if (pid <0) {
printf("fork error!\n")
exit(-1)
}
if (pid >0) {
printf("Parent. ppid(%d), pid(%d)\n", getppid(), getpid())
kill(pid, SIGKILL)
wait(NULL)
printf("Done\n")
} else {
printf("Child. ppid(%d), pid(%d)\n", getppid(), getpid())
sleep(3)
}
return 0
}
分几种情况:
父进程永不退出:这种情况下若子进程退出,而父进程没有收集子进程的退出状态,则此子进程会变为僵尸进程,一直占用少量资源,有危害;
父进程比子进程先退出:这种情况下父进程退出时,仍在运行的子进程会变为孤儿进程,孤儿进程会被托管给init进程,孤儿进程结束时由init进程负责回收;
父进程比子进程晚退出:子进程先退出时会变为僵尸进程,占用少量资源;待到父进程再退出时,子进程由僵尸进程变为孤儿进程,init进程会回收这些已僵死的孤儿进程,则这些已经僵死的孤儿进程就能瞑目而去了;
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)