Slackware 7.1
man daemon
No manual entry for daemon
В FreeBSD действительно есть и нею пользовался.
Но вообще, надо закрыть
fclose(stdin);
fclose(stdout);
fclose(stderr);
chdir("/");
fork();
Родитель должен завершить свою работу, а потомок уже работает в бэкграунде
После fork() потомку не помешает еще сделать setsid(), чтобы снять ассоциацию с группой процессов и управляющим терминалом. Если демону нужно о чем-то сообщить, он может юзать функцию syslog().
andy.
2vodz: только не надо фамильярничать, мы с Вами вместе водку не пили.
И не ляпнул, а взял из этой книги, ее чай не глупее Вас человек писал.
И потом спрашивали ссылки, эта книга, я считаю, очень хорошее пособие.
ЗЫ. Насчет умных слов: да, знаю. И свои знания с успехом применяю на практике.
2NewComer: Вот идите и читайте эти умные книжки. Как найдете,
опеределение "демон" и этих сигналов - приходите, поговорим дальше.
А на "ты" - это фидошная привычка. Откуда я знаю, мож для вас
"Вы" большее оскорбление?
2 vodz..
Это Вы батенька зря...
Сигнальчики то надо демону перехватывать...надо..
по своему обрабатывать и т.д.
Енто стандартная процедурка...или может у Вас демоны такие что они по sighup'у и sigusr'ам
вываливаются потеряв только что полученную информацию...
Да, ежели демон просто висит и память жрёт, то конечно можно ничего и не перехватывать..
И на человека зря наехали....Вам бы тоже не мешало енту литературу полистать...
Знаете, anonymous, я за свои 32 столько их прочел...
Вы бы прочли, КАКИЕ сигналы предлагает перехватывать
NewComer, а потом уж вклинивайтесь. Умники, блин.
2anonymous: Неужели вы до сих пор не прочли постинг NewComer-а?
Matrix спросил, я и Havoc норамально ответили.
Может вы и есть тот самый NewComer, прячущийся за анонима?
Конкретно по теме, создавалка демона отваливает после
fork(), кому теперь нужны указанные сигналы? Кто их будет перехватывать?
К тому же за возможность перехватывания SIGSTOP надо отрывать голову.
А все что можно, тоже глупо. Перехватывать надо только те сигналы,
которые будут служить специально для управления этим демоном,
например, SIGHUP - перечитать конфиг, SIGTERM - корректно завершиться,
доделав неотложные дела. Может вы предпочитаете убивать по KILL?
Нафиг. На то и есть SIG_IGN по умолчанию для некоторых сигналов.
2vodz:
Во-первых, Я НИКОГДА не скрываюсь под чужими именами.
Во-вторых, хамство НИКОГДА НИКОГО не украшало, а Вы, похоже,
этого до сих пор не уяснили, что подтверждает Ваш ответ анониму. Ну да ладно,
пусть это останется на Вашей совести.
А теперь по делу.
Цитирую Вас: "создавалка демона отваливает после fork(),
кому теперь нужны указанные сигналы? Кто их будет перехватывать?"
Перехватывать их будет потомок, т.к. диспозиция сигналов копируется в
порожденный процесс.Поэтому не помешает все лишние сигналы
игнорировать, если функциональность демона больше, нежели "Hello,World".
Кстати, если демон должен размножаться, напр, для параллельного обслуживания
входящих TCP-запросов, то нужно еще игнорировать SIGCHLD, а то его потомки,
завершившие свое выполнение, остаются в состоянии зомби до завершения работы
демона, а это не есть гуд. Кстати, до этого я докопался на собственном
опыте. Это к вопросу об умных книжках.
Когда я говорил о перехвате сигналов, о которых ломаются копья,
я конечно же имел в виду их игнорирование. И Аноним меня понял правильно.
По поводу обработки SIGHUP и SIGTERM полностью с Вами согласен,
так и делаю.
>"..я и Havoc нормально ответили..."
Ответил нормально все-таки Havoc, но не Вы.
2Вопрошавший:
Небольшое пояснение к ответу Havoc-a: Менять текущий каталог на корневой
потому, что если текущий каталог, из которого запускается демон, находится
на примонтированном разделе, то, не сделав chdir("/"), невозможно будет
этот раздел отмонтировать.
для некоторых, да... по умолчанию - ignore,
а например для sigusr'ов по умолчанию киляние...
теперь, посмотрим на реакцию большинства демонов на kill -SIGUSR1
не киляются........вывод: вы сами додумаетесь? или подсказать надо?
NewComer> Еще нужно перехватывать некоторые сигналы (SIGTTIN, SIGTTOU,SIGSTOP).
Сообщением раньше:
vodz> После fork() потомку не помешает еще сделать setsid()
SIGTTOU, и SIGTTIN после setsid() уже не придут, так, как генерируются они только при наличии управляющего терминала. Какого черта тогда их игнорировать ? Конечно послать их можно и с помощью kill(), но если уж захочется навредить, то от этого все равно никуда не денешься (SIGKILL пошлют). SIGSTOP, также, как и SIGKILL ни перехватить, ни проигнорировать нельзя. Скорее всего вы имели в виду SIGSTP - но и он не придет после setsid() (по причине, изложенной выше).
2timur: Спасибо. Вы настоящий друг. Не пожалели своего времени на
пальцах указать ошибки этих "девелопепперов". :)
Вот только ради пущей справедливости, то что вы сказали от моего ника, хоть и абсолютно верно,
но это сказал не я :)
> Перехватывать их будет потомок, т.к. диспозиция сигналов копируется в
Какая чушь.
> >"..я и Havoc нормально ответили..."
> Ответил нормально все-таки Havoc, но не Вы.
Havoc просто расписал то что делает СТАНДАРТНАЯ ДАВНО (в BSD, в Linux
с появлением Glibc2) функция daemon(), о чем собственно и был мой
первый постинг. Зачем делать то, что уже есть и оттестированно,
лучше взять нормальные доки.
2vodz: Почему же чушь?
Здесь Вы не правы.
Порожденный fork()-ом процесс является точной копией родителя.
А кроме диспозиции сигналов порожденный процесс наследует UID,GID,
переменные окружения, все файловые дескрипторы, управляющий терминал и другое.
По поводу daemon(): а как обстоит дело с ее переносимостью на не-BSD и не-linux
системы ?
А о том, что при отсоединении процесса от управляющего терминала некому будет слать
сигналы SIGTTIN,SIGTTOU,SIGSTP, я знал прекрасно. Все-таки их надо либо игнорировать,
либо вешать на них, как на SIGTERM, обработчик для нормального завершения работы демона.
Это для того, чтобы корректно его отстреливать kill-ом.
Вы отстреливаете демоны kill'ом с помощью именно этих сигналов ? Да поймите Вы наконец - если некому их посылать, значит и перехватывать(игнорировать) их не надо. А вот, к примеру, SIGALRM почему не игнорируете ? Вдруг какой нибудь нибудь кретин его пошлет с помощью kill'a ?
Я отстреливаю своих демонов сигналом SIGTERM, по которому они корректно завершаются
(уничтожают свои семафоры, разд. память, очередь сообщений).
>Да поймите Вы наконец - если некому их посылать, значит и
перехватывать(игнорировать) их не надо
Да, вы конечно правы, я просто перестраховался.
SIGALRM я не игнорирую, а перехватываю, и попылает его не кретин, а
мои демоны сами себе, в-частности, для обращения к АЦП-шке на очередном
цикле опроса датчиков.
2Havoc: Перехватывать сигналы до fork()
a) Плохой стиль, да и не удобно это - после отвала от управляющего
терминала они меняют свой смысл
b) Совершенно непригодно, если старт осуществляется враппером.
Про SIGTTIN,SIGTTOU,SIGSTP советую усиленно еще раз прочитать
умные книжки.
Про ALARM - это <B>ваше</B> личное дело, вы <B>опять</B> сказали не по делу.
Про SIGTERM - это не <B>вы</B> придумали. Марш читать <I>man shutdown</I>
Ну что за люди, пишут сами не знают что, не говоря уже о том
как <B>надо</B>. Все жрет кучу ресурсов, ворочается еле-еле,
падает на ровном месте и <B>совершенно нельзя доверять результату</B>.
Понахватают верхов, а как копнешь... <B><I>абсолютная пустота</I></B>.
По моему это писал не Havoc :). Естественно, SIGALRM упоминался мной в случае отсутствия в логике работы демона необходимости перехватывать этот сигнал. Во навернул :). А вообще мне надоел этот спор - по моему все уже давно все поняли. И демон, под который задавался этот вопрос наверное уже написан :).
Во блин, без меня меня склоняют.
Я здесь постил только один раз, да и сам прочел немало интересного.
Свой последний демон я писал год назад, да и то бросил это,
так как в той задаче можно было обойтись более простыми методами