Можете ли вы объяснить этот код C?(Создать программу deamon) - PullRequest
2 голосов
/ 09 декабря 2011

Я хочу хорошо понять следующий код:

/* Become deamon + unstoppable and no zombies children (= no wait()) */

if(fork() != 0)  return 0;        /* Parent returns OK to shell */
signal(SIGCLD, SIG_IGN);          /* ignore child death */
signal(SIGHUP, SIG_IGN);          /* ignore terminal hangups */
for(i = 0; i < 32; i++) close(i); /* close open files */
setpgrp();                        /* break away from process group */

Вот как я понимаю приведенный выше код:

1-я строка: Создание дочернего процесса и завершение родительского процесса, поэтому родительский родительский процесс возвращается к оболочке, а дочерний процесс продолжает выполнение программы в фоновом режиме.

2-я строка: Игнорировать сигнал, который должен быть отправлен родительскому процессу (который управляет терминалом), когда дочерний процесс (который выполняет программу) завершается. Я думаю, что эта линия позволит избежать появления детей зомби?

3-я строка: Я прочитал, что он игнорирует зависание POSIX, и я не уверен, что именно.

4-я строка: закрытие открытых файлов с файлами дескрипторов от 0 до 31 (я не уверен, почему от 0 до 31)

5-я строка: Понятия не имею, что он делает.


Не могли бы вы помочь мне хорошо понять этот код? Заранее спасибо:)

Ответы [ 3 ]

6 голосов
/ 09 декабря 2011

Вы спрашиваете, что делает setpgrp.

Вот соответствующая справочная страница

Вы можете набрать man setpgrp, чтобы получить ее.

Ознакомьтесь также с инструкцией linux daux

Вы также можете использовать функцию daemon

2 голосов
/ 09 декабря 2011

1) fork () 'и возвращаясь в родительском, имеет два значения: A) Запуск в фоновом режиме. Б) Избегайте зомби портативным способом

2) http://en.wikipedia.org/wiki/SIGCHLD

3) SIGHUP часто доставляется процессу, когда tty закрывается. Это более или менее означает «Продолжить работу, даже если связанный tty исчезнет».

4) Закрытие файловых дескрипторов позволяет запускать демон из чего-то похожего на ssh-сессию, при этом ssh-сессия не ожидает закрытия при закрытии файловых дескрипторов 0-31. Если вы этого не сделаете, демоны могут иногда вызывать зависание сеансов ssh при выходе. В 0-31 нет ничего волшебного - некоторые процессы закрывают больше файловых дескрипторов, чем это, но, конечно, 0, 1 и 2 имеют специальные значения: stdin, stdout, stderr соответственно.

5) http://en.wikipedia.org/wiki/Process_group

1 голос
/ 09 декабря 2011

Для создания демона вам необходимо:

  1. Вилка и родительский выход.
  2. Убедитесь, что вы не лидер группы процессов. Здесь не нужно вызывать setpgrp, так как мы только что разошлись, и мы являемся членом группы процессов, а не лидером.
  3. Создайте новый сеанс (setsid), это гарантирует, что у нас нет управляющего терминала.
  4. Мы унаследовали все дескрипторы от нашего родителя, закройте те, которые вам не нужны.
  5. Изменить рабочий каталог. Так что не на некоторых подключенных томах вы можете размонтировать. На самом деле, chroot, если вы можете здесь.
  6. Установить маску создания файлового режима на ноль.

Сигнальные линии в вашем коде просто устанавливают их, чтобы игнорировать эти сигналы. setpgrp не нужен, это должен быть setsid. Тогда вы просто упускаете некоторые другие вещи, которые вам нужно сделать.

...