ゾンビプロセスの作成に興味があります。私の理解では、ゾンビプロセスは、子プロセスの前に親プロセスが終了したときに発生します。ただし、次のコードを使用してゾンビプロセスを再作成しようとしました。
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
exit(0);
}
else {
sleep(100);
exit (0);
}
return 0;
}
ただし、このコードは実行直後に終了します。しかし、私がするように
ps aux | grep a.out
A.outは、予想どおりのゾンビプロセスではなく、通常のプロセスとして実行されていることがわかりました。
私が使用しているOSはubuntu14.0464ビットです
引用:
私の理解では、ゾンビプロセスは、子プロセスの前に親プロセスが終了したときに発生します。
これは間違っています。 _man 2 wait
_ によると(注を参照):
終了したが待たなかった子は「ゾンビ」になります。
したがって、ゾンビプロセスを作成する場合は、fork(2)
の後、子プロセスはexit()
であり、親プロセスは終了する前にsleep()
である必要があります。 ps(1)
の出力を観察する時間を与えます。
たとえば、次のコードを自分のコードの代わりに使用し、ps(1)
をsleep()
ing中に使用できます。
_#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* Child */
if (pid == 0)
exit(0);
/* Parent
* Gives you time to observe the zombie using ps(1) ... */
sleep(100);
/* ... and after that, parent wait(2)s its child's
* exit status, and prints a relevant message. */
pid = wait(&status);
if (WIFEXITED(status))
fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
(int) getpid(), pid, WEXITSTATUS(status));
return 0;
}
_