关于僵尸进程的深度解析

1

while(1)表示一个进程还在进行,如果如果不加则表示进程已经结束,因为进程是一个程序在执行过程的实例,因为a.out加上在终端上显示完成后就表示已经结束了。如果在子进程上加上while(1),则表示进程子进程在进行中,而父进程结束,如果此时父进程没有对孩子进程作任何处理的话,就变成我们所谓的僵尸进程。结束僵尸进程的办法有许多种,比如说可以kill 孩子的pid,也可以killall a。out即关闭所有没有结束的进程。如果僵尸进程没有得到很好地处理,就会有很大问题,第一进程描述符也占内存啊,,虽然很小,但是积少成多哦。这就表明此时在后台上运行,然而你并不知道,,再次对其文件的gcc的时候,你会发现有一个红色的a.out在闪烁,并且终端上显示错误是can not  open output file a.out:permission  denied .大家英文这么好久不需要我的翻译了吧,这既是所谓的守护进程的原理,如果创建子进程而终结父进程这就是我们所谓的守护进程,就是此时子进程在后台上运行,此时还有另外一种办法就是在终端上&加上运行的程序名,也可以同样实行。


2while(1)在父进程的时候,另外有时候还有一种显示defunct的时候。这时候while(1);然而此时子进程上有exit(0)的标志,说明此时子进程已经退出。用ps-ef|grep a.out 抓一下你会发现defunc,除了用上面的方法也能解决。

当然你也可以用wait或waitpid来结束子进程。这两个函数的用法你可以用man wait 在终端用其用法;


3

就是while(1)在子进程和守护进程上都有,说实话这并没有特殊的知识了,此时用ps-ef|grep a.out抓一下就会发现

有三个进程的pid,字父进程,还有一个a.out就这么多了,关于守护进程的原理思想下次我再给你们深度解析








#include
#include
#include  
#include
#include
#include
#include
#include
#include




111

while(1)是进程还在进行,在子进程下面加上表示,表示子进程还在进行,父进程已经结束,此时如果父进程没有对子进程进行处理的,那么就会形成僵尸进程,用ps-ef|grep a.out 你就会发现defunct说明进入了僵尸状态,图片上有,如果想结束这种状态你可以用 kill命令来杀死孩子的pid或者killall a.out




关于僵尸进程的深度解析_第1张图片

 
  
关于僵尸进程的深度解析_第2张图片 关于僵尸进程的深度解析_第3张图片

关于僵尸进程的深度解析_第4张图片




int main8()

{
pid_t pid = fork();
switch (pid)
{
case -1:
perror ("fork");
break;
case 0: // 子进程
printf ("我是子进程,我的Id 是%d\n", getpid());
sleep(5);
exit(0);
default: // 父进程
printf ("等待子进程挂掉\n");
sleep(3);
pid_t childId = wait(NULL);

printf("父进程:  %d\n",getpid());

printf ("成功处理一个子进程, 该子进程是 : %d\n", childId);

sleep (5);

while(1);
break;
}


return 0;
}
 
 int main9()
{
int count = 10;
while (count--)
{


pid_t pid = fork();
switch (pid)
{
case -1:
perror ("fork");
break;
case 0: // 子进程
printf ("我是子进程,我的Id 是%d\n", getpid());
sleep(5);
exit(0);

default: // 父进程

printf("父进程:  %d\n",getpid());


break;
}

}

printf("等到返回的子程序进程描述符");
while (1)
{
pid_t childId = wait (NULL);

if (childId==-1)
break;
printf ("成功处理一个子进程, 该子进程是 : %d\n", childId);

}




return 0;
}


int main10()
{
pid_t pid = fork();
switch (pid)
{
case -1:
perror ("fork");
break;
case 0: // 子进程
printf ("我是子进程,我的Id 是%d\n", getpid());
while(1);
exit(0);
default: // 父进程
printf ("等待子进程挂掉\n");
printf("父进程:  %d\n",getpid());

int status;
pid_t childId = wait(&status);

printf ("成功处理一个子进程, 该子进程是 : %d, %d\n", childId, status);

if ( WIFEXITED(status))
{
printf ("正常死亡\n");
}
else
{
printf ("被人做掉\n");
}
break;
}
return 0;

 
}
int main7()
{
pid_t pid = fork();
switch (pid)
{
case -1:
perror ("fork");
break;
case 0: // 子进程
printf ("我是子进程,我的Id 是%d\n", getpid());

_exit(0);
default: // 父进程
printf ("等待子进程挂掉\n");

  
int status;
pid_t childId = waitpid(-1, NULL, WNOHANG);
printf("父进程: %d\n",getpid());
printf ("成功处理一个子进程, 该子进程是 : %d, %d\n", childId, status);
while (1);
break;
}
return 0;
}

你可能感兴趣的:(关于僵尸进程的深度解析)