Programowanie w języku C/C++ » FAQ

Daemonizowanie procesu w systemie Linux

  • 2010-10-31 18:27
  • 7 komentarzy
  • 2247 odsłon
  • Oceń ten tekst jako pierwszy
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

7 komentarzy

sznurek 2008-04-07 13:40

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

Marooned 2007-07-04 15:45

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

Marooned 2007-05-11 20:36

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.

lofix 2007-05-11 19:43

to FAQ, nie artykul

Marooned 2007-05-11 17:20

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

Ktos 2007-05-10 20:35

Cóż za demoniczny proces nam wyszedł!

flabra 2007-05-28 12:25

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