не могу создать процесс зомби в linux

Ну у меня странная проблема. Я не могу создать зомби-процесс в своем проекте, но могу сделать это в другом файле. Есть простая инструкция:

int main()
{
    if(fork()==0)
        printf("Some instructions\n");
    else
    {
        sleep(10);
        wait(0);
    }
    return 0;
}

Этот простой код создает зомби-процесс на 10 секунд. Я проверяю, и он действительно существует.

Но если я скопирую этот код в свою программу (свою собственную оболочку), все будет выполняться, как и раньше, НО процесс зомби вообще не существует. Я не знаю, в чем разница. Это тот же код.

Есть ли дополнительная информация, которую я должен знать об этом? Есть ли другой простой способ создать зомби?


person krzakov    schedule 30.11.2012    source источник
comment
Мне любопытно, почему вы хотите создать зомби?   -  person Keith    schedule 30.11.2012
comment
Эта программа проста и предельно проста. Как будет выглядеть ваша большая программа, когда вы скопируете в нее этот код?   -  person John Kugelman    schedule 30.11.2012
comment
есть ли шанс, что у вас есть обработчик SIGCHLD в этом более крупном проекте? или иным образом изменил значение по умолчанию?   -  person PypeBros    schedule 30.11.2012
comment
Это вообще не имеет смысла, как есть. Я не вижу смысла создавать процесс только для того, чтобы он сразу перестал существовать. Чего именно вы пытаетесь достичь?   -  person netcoder    schedule 30.11.2012
comment
Вы не создаете зомби, если игнорируете сигнал SIGCHLD или устанавливаете флаг SA_NOCLDWAIT при установке обработчика SIGCHLD pubs.opengroup.org/onlinepubs/009695399/functions/   -  person chill    schedule 30.11.2012
comment
Ну мне нужно создать зомби, это факт. У меня нет обработчика SIGCHLD.   -  person krzakov    schedule 02.12.2012


Ответы (1)


Попробуйте этот скрипт Python:

#!/usr/bin/python
# -*- coding: utf8 -*-

import subprocess
import time
import threading

# Create 100 subprocesses 

proc = {}
for i in xrange(0,1000):
        proc[i] = subprocess.Popen(['ls','-l'])

# create zombies from this processes, observe one minute zombies
time.sleep(60)

# Zombies dead
proc.communicate()

time.sleep(5)

После этого проверьте зомби:

# ps -A | grep defunc
14711 pts/49   00:00:00 ls <defunct>
14713 pts/49   00:00:00 ls <defunct>
14716 pts/49   00:00:00 ls <defunct>
.... 
14740 pts/49   00:00:00 ls <defunct>
14741 pts/49   00:00:00 ls <defunct>
14742 pts/49   00:00:00 ls <defunct>
14743 pts/49   00:00:00 ls <defunct>
14746 pts/49   00:00:00 ls <defunct>
14749 pts/49   00:00:00 ls <defunct>
....
14805 pts/49   00:00:00 ls <defunct>
14806 pts/49   00:00:00 ls <defunct>

Or C:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{ 
  pid_t child_pid;

  child_pid = fork ();
  if (child_pid > 0) {
    sleep (60);
  }
  else {
    exit (0);
  }
  return 0;
}

Должно работать как волшебство, как кристально чистый Haitian Vodou.

person Community    schedule 10.07.2013