あなたはゾンビの概念をより良く理解してもらうためには、私たちがゾンビのBaiduの百科事典の定義を見てみましょうになります。
ゾンビ(キョンシー):名前は、剛体を示唆するように、また、死者のジャンプとして知られ、死体を移動します。特に人間の死の後、中国の民間伝承では、ゴーストカイの体が重すぎるばらつきがなさので、非人間的な、非常識な、横に伸ばし、彼の手が前方に展開され、彼の足で移動するためにジャンプを保持ゾンビ、加えて頭や手足、体の動きの他の部分難しいです。原因は、現代のプラス映画やテレビを想像し、彼らは、このような強大な、不死身、腐食などなど超自然的な力を持っている傾向があり、そして人間を攻撃する武器や武術を用いても。
だから、ゾンビは、死んで殺されることができない、ここでも問題は死ぬん。死は生きて、死んだの反対で死んでいます。のみ住む人々を死滅させることができます。
ゾンビとは何ですか?
それがゾンビプロセスの意味があることが明らかにすべてのmakeの最初に:子供は死んでいるが、親プロセスはその中間状態の(待機)1を回復していない、この時間は、子プロセスがゾンビです。通常、子プロセスが子プロセスを一掃、子資源循環によってtask_struct親を待って、ハングアップ、PIDは、子プロセスを解放します。次のコードを参照してください。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid, wait_pid;
int status;
pid = fork();
if (-1 == pid)
{
perror("fork");
exit(1);
}
else if (0 == pid)
{
printf("child pid = %d\n", getpid());
pause();
}
else
{
wait_pid = waitpid(pid, &status, 0);
if (WIFSIGNALED(status))
{
printf("child process is killed by signal %d\n", WTERMSIG(status));
}
exit(0);
}
return 0;
}
コンパイルして実行した後:
# gcc zombie_process.c -o zombie_process
# ./zombie_processchild
pid = 16904
psコマンドでプロセスのステータスを確認します。
子プロセス16904を強制終了します。
# kill -2 16904
次のように親プロセスが出力されます。
child process is killed by signal 2
その後、子プロセス16904は、親プロセスがwaitpidのためにあるため、消えて、だけでなく、子供が信号2によって殺されることを知っているだろう。何の問題もなくプログラム。
コードにわずかな変更。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid, wait_pid;
int status;
pid = fork();
if (-1 == pid)
{
perror("fork");
exit(1);
}
else if (0 == pid)
{
printf("child pid = %d\n", getpid());
pause();
}
else
{
while (1);
}
return 0;
}
我々は、状態PSを通じてプロセスを確認するために、実行するために再コンパイル:
17022キル同じように子プロセス:
kill -2 17022
しかし、ときに我々は異なる現象を見て、再び状態のプロセスを見つけるために、psコマンドを使用します。私たちは17022は、名前もなっ棺[] [zombie_process]を追加Zにゾンビ状態になりました:
ゾンビプロセスが殺さすることはできません。
仏は仏を殺し、ストップ神、神を殺して、私たちはそれを取り除くしたいので、Linuxのは、信号9を持っていると言われて、非常に不幸なゾンビである17022を超える参照してください、SIGKILLで、この信号は神の存在で、私たちは今、キルを使用して - 9キル17022:
kill -9 17022
利用PSは再び状態のプロセスを表示します。
即使我们把17022用kill -9捅了好多刀,但是最后看17022还是僵尸,一直没有消失。因为僵尸已经是死了,它不可能再次被杀死,你给它捅一万刀,它也是个死人,不可能再次死! 僵尸不可能被杀死,因为它已经死了!只能等父进程用wait来清理尸体了。这个时候我们能够把僵尸清理掉的方法,就是杀死僵尸进程的父进程17021。
一个僵尸可以被杀死的假象!
下面的这个程序证明“僵尸可以被杀死”:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void *mythread(void *arg)
{
while (1);
}
int main()
{
int ret;
pthread_t tid;
ret = pthread_create(&tid, NULL, mythread, NULL);
if (-1 == ret)
{
perror("pthread_create");
exit(1);
}
usleep(1000);
pthread_exit(0);
return 0;
}
在主线程里面,pthread_create()创建线程后,pthread_exit()退出。编译代码并运行:
#gcc zombie_thread.c -o zombie_thread -lpthread
#./zombie_thread
再打开一个终端,通过ps查看进程的状态,zombie_thread显示为一个僵尸:
这个时候我们来杀死17082这个僵尸:
kill -9 17082
我们会惊奇地发现,17082真的会从ps命令里面消失!
我们把时间轴拉回调用 kill -9 17082 之前。刚才我们“看起来”能杀死僵尸的本质原因是,当主线程17082调用pthread_exit()退出后,主线程17082的状态确实是僵尸了,但是该进程里面的17083线程,却没有死:
下面分别看下两个线程的状态:
17082
17083
17083是活着的,证明整个进程并没有挂。所以17082的退出,只是让整个进程 半死。 而由于ps命令的误会,17082凑巧又是整个进程的PID,它显示好像整个17082成了僵尸一样。
我々が殺す-9 17082を実行したときだけでなく、POSIX標準精細度信号(信号)に応じて、全体のプロセス17082を殺すことです(17082は、17082とTGIDの17083であり、PIDがプロセス全体のユーザーの正常視点です)、私たちは17082だった殺され、この時間はので、全体のプロセスが死んでいる、この時間は、ゾンビの消失につながる、ロジックを待つために、親プロセスを実行することと等価です。したがって、この例では、殺す-9 17082表示され、「ゾンビを殺す、」それは、死の過程で、その結果、全体のプロセス(各スレッド内を含む)17082を殺しているためであると。これに先立ち、全体のプロセス実際にはまだ生きています。
話はそんなに、それは、書き込みコードにあなたを伝えることです未決、コード内のどこかを回復するために、問題のプロセスまたはスレッドをリサイクルに注意を払う必要があり、プロセスの各スレッドが作成したり、リソース回避のバグが原因で発生します。
よりエキサイティングなビデオは、記事では、埋め込まれた学習教材は、マイクロチャネル社会的関心の数が「インテリジェントハードウェアのメリットを学びました。」
、