ゾンビプロセスと孤児プロセス
2451 ワード
孤児プロセスとゾンビプロセスとは何ですか?
一、孤児プロセス
1.孤児プロセスとは:
子プロセスの親プロセスが子プロセスより先に終了すると、子プロセスは孤児プロセスになります。それはinitプロセスによって養子縁組され、initプロセスのサブプロセスになります。
通俗的には、父(父プロセス)が亡くなり、息子(子プロセス)が孤児(孤児プロセス)になり、息子が孤児院(initプロセス)に養子縁組された。
2.孤児プロセスをどのように生成するか:
#include
#include
#include
int main(void)
{
int pid;
if((pid = fork()) == -1)
{
perror("fork");
exit(1);
}
if(pid == 0)
{
// ,
while(1)
{
sleep(1);
}
}
else
{// else, 。
// else , ,
;
}
return 0;
}
スクリーンショット:
二、ゾンビプロセス
1.ゾンビプロセスとは?
(1). ゾンビプロセスは特殊なLinuxプロセス状態です
(2). ほとんどのメモリ領域を放棄し、実行可能なコードもスケジューリングもできず、プロセスリストに1つの位置を保持し、そのプロセスの終了状態などの情報を親プロセスが収集するために記載するだけで、ゾンビプロセスは内蔵領域を占有しなくなった.
(3).wait()やwaitpid()などの親プロセスが必要です.親プロセスが存在する間に終了していない場合、終了したサブプロセスに死体を収容していない場合は、ゾンビの状態を維持します.
2.ゾンビプロセスの影響:
すでに終了したプロセスですが、プロセステーブルから削除されていません.多すぎると、プロセステーブルのエントリがいっぱいになり、システムがクラッシュしますが、他のシステムリソースを占有しません.
3.ゾンビプロセスを生成する:
zombie.cファイル
> #include
スクリーンショット:
3.ゾンビの発生を防ぐにはどうすればいいですか?
>-ゾンビプロセスが発生した原因は、親プロセスがサブプロセスに死体を収容していないためです.解決策は、親プロセスにサブプロセスが停止していることを知らせ、サブプロセスに死体を収容することです.親プロセスはどうしてサブプロセスが停止したことを知っていますか?-サブプロセスが終了すると、親プロセスに通知する信号SIGCHLDが親プロセスに送信されます.では、私たちはこの信号を遮断して、その信号を処理する関数の中でサブプロセスのために死体を収容することができます!
#include
#include
#include
#include
//
void sigcb(int signo)
{
int status;
if( signo == SIGCHLD )
{
printf("child exit!
");
// ( )
wait(&status);
}
}
int main(void)
{
int pid = -1;
// SIGCHLD sigcb
signal(SIGCHLD, sigcb);
pid = fork();
if(pid < 0)
{
return -1;
}
else if(pid == 0)
{
//
exit(0);
}
while(1)
{ // ,
sleep(1);
}
return 0;
}
スクリーンショット: