The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"...как создать демона? помогите!:("
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"...как создать демона? помогите!:("
Сообщение от mikem emailИскать по авторуВ закладки on 23-Сен-03, 21:15  (MSK)
не понимаю, хоть...
...есть одна программа (исходники) под Kylix 3 - маленький сервер:
...
main(){
TMEApplication *MEApp;
try {
MEApp = new TMEApplication(NULL);
  try {
  MEApp->Execute();
  } __finally {
    delete MEApp;
        }
       } catch(Exception &E) {
        syslog(LOG_NOTICE,"ME_Exception %s: %s", E.ClassName(), E.Message);
      }
...
и это все в консольном исполнении. Я переделал ее под свои нужды, а демоном сделать не получается. И в инете нигде нарыть не могу (есть только паскалевский код который я не понимаю) :(
Вопрос: как это запустить демоном?
Я пытаюсь чтото сделать с fork() и exit(), но, или 100% загрузка проца, или сразу вываливается, а иногда вообще приходится кецать зомби kill -7 номерпида.
в проге также перед ->Execute() выполняются
setgid(...);
setuid(...);
chdir("/");
fclose(stdin);
fclose(stdout);
fclose(stderr);
и setsid() после exit(0);
я виндозный програмер, а с юниксом пытаюсь подружиться, но чтото ...
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "...как создать демона? помогите!:("
Сообщение от divan emailИскать по авторуВ закладки on 24-Сен-03, 12:53  (MSK)
Демон создаеться путем создания копии процесса(ну fork() тоесть) и убивания предка. Дочерний процесс уходит в фоновый режим, если родительский был запущен из шелла. Он наследует идентификатор группы процессов, но получает свой собственный pid, так что для того чтобы сделать его главным надо вызвать еще функцию setsid()

Культурные программисты правда создают два форка - чтобы процесс не смог получить управляющий терминал. Для этого еще надо проигнорить SIGHUP, так как первый форк когда завершаеться посылает всем своим детям SIGHUP.

Вот простенький листинг:

void daemon_init(void) {
    pid_t pid;

    if ( (pid = fork()) != 0 )
        exit(0);

    setsid();

    signal(SIGHUP, SIG_IGN);

    if ( (pid = fork()) != 0 )
        exit(0);

    chdir("/");

    umask(0);
}

Грубо говоря вот так.

А вобще все это очень хорошо документировано.
И лучше не пытаться дружить с юниксом через Кыликс :) - тока поссориться можно.

Good luck!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "...как создать демона? помогите!:("
Сообщение от Murr Искать по авторуВ закладки on 04-Окт-03, 01:53  (MSK)
>Культурные программисты правда создают два форка - чтобы процесс не смог получить
>управляющий терминал.
Рискну предположить, что это скорее бывает нужно, если демон будет делать fork, чтобы при выходе головного демона его дети не получили SIGHUP (который после этапа загрузки демона используется в целях администрирования оного). А чтобы не получить по ошибке управляющий терминал проще всего открывать терминалы с флажком (O_NOCTTY), кстати большинству демонов незачем открывать терминалы.

P.S. BTW, В некоторых UNIX при открытии терминала лидером сеанса он не становится автоматически управляющим (нужно делать TIOCSCTTY).

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "...как создать демона? помогите!:("
Сообщение от Murr Искать по авторуВ закладки on 04-Окт-03, 01:47  (MSK)
В glibc есть для этого функция daemon (man daemon).
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру