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

Я возился с 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 .

  • Ядро Linux 3.2 syscalls
  • «Фатальная ошибка: stdio.h: нет такого файла или каталога» при компиляции файла C
  • Где исходный код реализации «scanf»?
  • Как я могу выполнить «дату» внутри задания вкладки cron?
  • закрытие дескрипторов нежелательных файлов
  • Перекрестное компиляция программного модуля
  • default wordsize в UNIX / Linux
  • Освобождение программного обеспечения linux - совместимость
  • Стереофонический захват с v4l2
  • Как скомпилировать программу ac, не выходя из редактора?
  • Загружать службу в Linux программно
  • Linux и Unix - лучшая ОС в мире.