Daemonizowanie procesu w systemie Linux

flabra
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://4programmers.net/Forum/370971

7 komentarzy

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

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

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.

to FAQ, nie artykul

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

Cóż za demoniczny proces nam wyszedł!

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