孤儿进程
父进程死亡,但是子进程还没有死亡,该子进程为孤儿进程。
子进程被init进程领养,init进程变成孤儿进程的父进程
目的:为了释放子进程占用的系统资源。
进程结束之后,能够释放用户区空间,但释放不了pcb(进程控制块),该pcb必须由子进程的父进程进行释放。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, const char * argv)
{
pid_t pid = fork();
if (pid == 0)
{
sleep(1);
printf ("child pid = %d, ppid = %d\n", getpid(), getppid());
}
else if (pid>0)
{
printf ("=============parent\n");
printf ("child pid = %d, ppid = \
%d\n", getpid(), getppid());
}
return 0;
}
僵尸进程
子进程死亡,父进程还有,父进程不去释放子进程的pcb,该子进程变成了僵尸进程。即:进程死了但是还占用一定的空间。
是一个已经死掉的进程。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
int main(int argc, const char * argv)
{
pid_t pid = fork();
if (pid == 0)
{
sleep(1);
printf ("child pid = %d, ppid = %d\n", getpid(), getppid());
}
else if (pid>0)
{
while (1)
{
sleep(1);
printf ("=============parent\n");
printf ("child pid = %d, ppid = \
%d\n", getpid(), getppid());
}
}
return 0;
}
使用ps aux可以看到该僵尸进程,中括号括起,右边有defunct,显示死亡
kill杀的是活进程,对于僵尸进程,没用。但可以杀死该子进程的父进程,从而达到杀死僵尸进程的目的。