Ten artykuł wymaga dopracowania!

Jeżeli możesz popraw ten artykuł według zaleceń, które możesz znaleźć na stronie Artykuły do poprawy. Po dopracowaniu tego tekstu można usunąć ten komunikat.


Daemon – w wielozadaniowych (najczęściej uniksopodobnych) systemach operacyjnych proces, który pracuje w tle bez konieczności interakcji z użytkownikiem - z Wikipedii.

Daemony najczęściej wykorzystuje się przy serwerach sieciowych (np. WWW czy FTP) - pozwala to na ich nieprzerwane działanie w tle będąc zależnym tylko od procesu init.

Żeby program stał się Daemonem musi (nie wszystkie punkty są konieczne):
  1. Utworzyć proces potomny i przekazać sterowanie do niego (fork)
  2. Utworzyć nową grupę procesów (setsid)
  3. Dobrym zwyczajem jest zamknięcie wszystkich deskryptorów plików
  4. Przekierować standardowe wejście/wyjście w nicość (do /dev/null)
  5. Stworzyć plik zabezpieczający przez uruchomieniem więcej niż 1 raz (można to zrobić w inny sposób)
  6. Oraz zająć się obsługą najważniejszych sygnałów


 
void Daemonize()
{
        int i,lfp;
        char str[10];
        char* LOCK_FILE = "AGate.lock";
 
        if(getppid()==1) return; /* already a daemon */
        i=fork();
        if (i<0) exit(1); /* fork error */
        if (i>0) exit(0); /* parent exits */
        /* child (daemon) continues */
        setsid(); /* obtain a new process group */
        for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
        i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
        umask(027); /* set newly created file permissions */
        chdir("/tmp"); /* change running directory */
        lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
        if (lfp<0) exit(1); /* can not open */
        if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
        /* first instance continues */
        sprintf(str,"%d\n",getpid());
        write(lfp,str,strlen(str)); /* record pid to lockfile */
        signal(SIGCHLD,SIG_IGN); /* ignore child */
        signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
        signal(SIGTTOU,SIG_IGN);
        signal(SIGTTIN,SIG_IGN);
        signal(SIGHUP, SignalHandler); /* catch hangup signal */
        signal(SIGTERM, SignalHandler); /* catch kill signal */
}
 


Za Bułą: http://forum.4programmers.net/viewtopic.php?p=370971

Kategoria: C » FAQ, Artykuły do poprawy

7 komentarzy

Avatar: sznurek
Napisany 2008-04-07 13:40 przez sznurek

Dodałem skromy opis, lecz nie wiem czy jest poprawny - mógłby ktoś bardziej obeznany w temacie to sprawdzić?

Avatar: Marooned
Napisany 2007-07-04 15:45 przez Marooned

flabra - no następny..
kawałki kodu to sobie można na pastebin wrzucać, a jak ktoś nie rozumie to google

na 4p mają być arty reprezentujące jakiś poziom - ten go nie ma
a sam nie poprawiam, bo otarłbym się o dyletanctwo

Avatar: Marooned
Napisany 2007-05-11 20:36 przez Marooned

Co z tego? Ja nadal nie wiem co ten FAQ przedstawia i po co jest. Powiesz, że się nie znam, więc ten FAQ nie jest dla mnie - ale faktem jest, że to właśnie dla osoby, która czegoś nie wie są takie materiały - gdybym wiedział, to bym nie potrzebował.
Sorry. ale wrzucenie kawałka kodu bez ładu i składu mija się z celem.

Avatar: lofix
Napisany 2007-05-11 19:43 przez lofix

to FAQ, nie artykul

Avatar: Marooned
Napisany 2007-05-11 17:20 przez Marooned

Ale sorry, zero opisu co ten kod robi, do czego można go wykorzystać.. sama nazwa artykułu <u>nie</u> wystarczy.
Do poprawy

Avatar: Ktos
Napisany 2007-05-10 20:35 przez Ktos

Cóż za demoniczny proces nam wyszedł!

Avatar: flabra
Napisany 2007-05-28 12:25 przez flabra

to zamiast narzekac ogarnij sie i popraw jak cie boli. na moj gust kazda linijka jest na tyle dobrze skomentowana, ze nie potrzeba nic wiecej, a jesli czegos nie rozumiesz google -> 'man online' i w manie masz kazda jedna funkcje

4programmers.net