Как создать зомби-процесс, который нельзя пожинать за несколько минут

0

Может ли кто-нибудь предложить мне простой способ создать зомби-процесс, который не может быть получен в течение нескольких минут. Цель этого - протестировать родительский процесс для возможности использовать процессы зомби после их повторного использования.

Один случай для невосполнимых зомби можно найти здесь. Я предполагаю, что могут быть более простые способы сделать это.

ОС: Linux

Предпочтительные языки: C/C++

  • 0
    Определить зомби-процесс? иначе вы могли бы также сделать процесс, который sleep(ETERNAL);
  • 0
    @ Surt Я думаю, что тег зомби-процесса отлично определяет этих зверей :)
Показать ещё 4 комментария
Теги:
zombie-process

1 ответ

0

Здесь небольшая программа, которая заставит зомби появиться в вашем "ps aux" выходе в течение нескольких минут. Обратите внимание на пропущенный waitpid(); если вы не прокомментируете этот вызов, зомби не появится, так как вызов waitpid() заставляет родительский процесс требовать его мертвого ребенка.

(Отказ от ответственности: я только тестировал это под MacOS/X, так как тот компьютер, на котором я нахожусь, но он должен работать так же в Linux)

#include <stdio.h>
#include <signal.h>
#include <pthread.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
   printf("Starting Program!\n");

   int pid = fork();
   if (pid == 0)
   {
      printf("Child process %i is running!\n", getpid());
      sleep(300);  // wait 5 minutes
      printf("Child process %i is exiting!\n", getpid());
      return 0;
   }
   else if (pid > 0)
   {
      printf("Parent process is continuing child pid is %i...\n", pid);
      sleep(5);  // just for clarity
      printf("Parent process is sending SIGKILL to child process...\n");
      if (kill(pid, SIGKILL) != 0) perror("kill");
      // waitpid(pid, NULL, 0);  // uncomment this to avoid zombie child process

      printf("Parent process is sleeping... ps aux should show process #%i is a zombie now\n", pid);
      sleep(500);  // just for clarity
      printf("Parent process is exiting!\n");
   }
   else perror("fork()");
}
  • 0
    Спасибо за ответ. Хотя, как я уже говорил, мне нужно зомби, которого нельзя пожинать какое-то время. Вы получаете зомби, потому что вы не пожинаете его - это другой случай

Ещё вопросы

Сообщество Overcoder
Наверх
Меню