Как заставить процессы не умирать после того, как его родительский штамп?

Я возился с forkbombs и замечал, что если я просто развивал процесс fork (), то уничтожение начального процесса приведет к разрушению всего дерева. Это не относится к forkbombs, написанным в BASH, с использованием своего оператора background &, поэтому я знаю, что есть способ обойти это. Как достичь того же результата в C?

Я использую forkbomb примеры из Википедии: http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs

2 Solutions collect form web for “Как заставить процессы не умирать после того, как его родительский штамп?”

Если вы делаете это на C, вам нужно сделать setsid(2) в вашем коде, а также некоторые вызовы fork() и exit() . setsid() имеет этот эффект:

… создает новый сеанс, если вызывающий процесс не является лидером группы процессов. Вызывающий процесс является лидером нового сеанса, лидером группы процессов новой группы процессов и не имеет управляющего tty.

Это из справочной страницы. В принципе, если процесс, который является лидером группы процессов, получает определенные сигналы, каждый идентификатор процесса в этой группе процессов получает сигнал. Вы можете увидеть механизм для этого в man-странице kill(2) . Если PID, который вы вызываете kill() является отрицательным, сигнал посылается каждому процессу в группе процессов.

Вам также необходимо использовать fork() и exit() в правильных местах. В основном посмотрите инструкции о том, как стать процессом демона . Детали, которые вам нужно сделать:

 switch (fork()) { case -1: return -1; case 0: break; default: _exit(EXIT_SUCCESS); } setsid(); switch (fork()) { case -1: return -1; case 0: break; default: _exit(EXIT_SUCCESS); } 

Читайте о том, как стать демоном для большей части обоснования этого кода.

Есть два способа выполнить фоновый процесс, а затем сохранить его. Если команда была запущена, а затем в фоновом режиме с помощью & вы можете использовать эту команду, чтобы отключить ее от вашего терминала.

 $ disown -a 

Если вы хотите изолировать процесс от сигнала зависания (HUP), а также отсоединить его от терминала (tty), вы также можете использовать эти команды:

 $ nohup <cmd> 

Любой вывод консоли будет записан в файл nohup.out .

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

Для других идей взгляните на мой ответ на этот вопрос U & L под заголовком: Где находится fork () на fork bomb: () {: |: &};:? ,

С

Я бы посмотрел на этот поток из SO, озаглавленный: C: Exec / fork> Defunct процессы , в частности, этот ответ от @Gilles .

  • Тестирование кода на C ++ с помощью команд bash
  • Внешняя команда для принудительного сброса потока
  • Как вызвать фрагментацию памяти на встроенном устройстве на базе Linux?
  • Как настроить мое окружение таким образом, чтобы была использована правильная (отличная от системы) версия библиотеки
  • Почему дочерний элемент vfork или fork вызывает _exit () вместо exit ()?
  • sudo apt-get install g ++ - 4.8-multilib не работает на Mint?
  • Пользовательский протокол уровня ссылки в UNIX
  • Определить имя статической / динамической библиотеки
  • В чем преимущество архивирования объектных файлов C в статической библиотеке (файл .a)?
  • Что могло привести к тому, что исполняемые файлы g ++ (и clang ++) перестали работать?
  • Linux не может компилироваться без оптимизации GCC; последствия?
  • Interesting Posts

    Удалить старые каталоги в соответствии с именем каталога?

    Как узнать наибольшее количество во многих документах, содержащих разные номера

    Запуск jackd после использования другого аудио

    Какая из этих трех команд сообщает информацию TRUE Redhat

    Если драйверы nvidia и nouveau будут установлены для перехода через GPU

    Запустить команду на вход и выход ssh при завершении команды

    Когда использовать арку против noarch при создании RPM?

    URI устройства для принтера

    Тачпад Synaptics неактивен до приостановки, активен после возобновления

    Как подключиться через sftp к нестандартному порту на Midnight Commander?

    Как изменить оболочки через скрипт?

    Срез между двумя строками (электронная почта + слово)

    Удаление пустого файла, почему так много вызовов sys?

    Копирование родительского каталога в подкаталог без бесконечной петли

    Удалить новую строку из переменной unix

    Linux и Unix - лучшая ОС в мире.