Intereting Posts
Установка Arch Linux с загрузкой UEFI и макета GPT почему emacs останавливает суперпользователя от редактирования файлов без разрешения? Не удается запустить docker hello-world: точка монтирования для устройств не найдена Запускать обновления безопасности Ubuntu каждую субботу Погиб почтой с сигналом 15 Файл конфигурации для ядра в среде VM devtoolset-4 был удален из centos-release-scl? Понимание использования шрифтов в OpenMotif Как приложения GUI будут работать, если нет системного трея? Значение `expr 'hello": "\ ( * \)" `? Почему wget не может загружать страницу как root? Рекомендация Distro для «Out The Box Multi Touch Tablet Support» Использование sed для удаления целой строки, если оно содержит только определенный номер Отключить выполнение вкладки в Bash для какой-либо директории, содержащей большое количество файлов? Не удалось добавить существующего пользователя в существующую группу в ubuntu

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

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

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

Если вы делаете это на 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 .