Felhasználói eszközök

Eszközök a webhelyen


oktatas:linux:demon_programozasa

< Linux

Démon programozás

  • Szerző: Sallai András
  • Copyright © Sallai András, 2018
  • Licenc: GNU Free Documentation License 1.3

A démonkészítés lépései

  • gyermek folyamat létrehozása (fork)
  • a fájlmód mask-ról umask-ra állítása,
    • hogy a démon írhasson az általa létrehozott fájlokba
  • naplófájl megnyitása írásra
  • munkamenet azonosító létrehozása
    • Session ID (SID)
    • a gyermekfolyamatnak szükség van a kerneltől egy ilyen démon azonosítóra
    • másként árva lesz a gyermekfolyamat
  • az aktuális munkakönyvtár biztonságos helyre váltása
    • olyan könyvtárra kell állítani ami biztosan mindig létezik a Linuxos rendszerben
    • a gyökér mindig létezik
  • bezárjuk a szabványos fájlleírókat
    • biztonsági kockázat ha nyitvamard
    • a démon úgy sem tudja használni
  • a démon tevékenységének kódja

Linux démon forrása

Az alábbi mintaprogram Devin Watson munkája. BSD licenc alatt terjeszthető.

demon.c
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
 
int main(void) {
 
        /* Our process ID and Session ID */
        pid_t pid, sid;
 
        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }
 
        /* Change the file mode mask */
        umask(0);
 
        /* Open any logs here */        
 
        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }
 
 
 
        /* Change the current working directory */
        if ((chdir("/")) < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }
 
        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
 
        /* Daemon-specific initialization goes here */
 
        /* The Big Loop */
        while (1) {
           /* Do some task here ... */
 
           sleep(30); /* wait 30 seconds */
        }
   exit(EXIT_SUCCESS);
}

Fordítás:

gcc -o demon demon.c

Futtatás:

./demon

Leállítás:

kiallall demon

</code>

Egyszerű fájlba író démon

demon.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
 
int main(int argc, char* argv[]) {
 
    FILE *fp= NULL;
    pid_t pid = 0;
    pid_t sid = 0;
 
    int i = 0;
    pid = fork();// új folyamat elágaztatása
 
    if (pid < 0) {
        printf("elágaztatás sikertelen!\n");
        exit(1);
    }
 
    if (pid > 0) { // a szülőfolyamat
       printf("A gyermekfolyamat azonosítója: %d \n", pid);
       exit(0); //A szülőfolyamat sikeres befejezése
    }
 
    umask(0);//fájlmód beállítása
 
    sid = setsid();//új munkamenet beállítása
    if(sid < 0) {
        exit(1);
    }
 
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
 
    fp = fopen ("naplo.txt", "w+");
    while (1) {
        sleep(1);
        fprintf(fp, "%d", i);
        fflush(fp);
    }
    fclose(fp);
 
    return (0);
}

Fordítás:

gcc -o demon demon.c

Futtatás:

./demon

Forrás

oktatas/linux/demon_programozasa.txt · Utolsó módosítás: 2019/08/16 21:30 szerkesztette: admin