Felhasználói eszközök

Eszközök a webhelyen


oktatas:linux:demon_programozasa

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

oktatas:linux:demon_programozasa [2019/08/16 21:30] (aktuális)
admin létrehozva
Sor 1: Sor 1:
 +[[oktatas:​linux|<​ Linux]]
  
 +====== Démon programozás ======
 +  * **Szerző:​** Sallai András
 +  * Copyright (c) Sallai András, 2018
 +  * Licenc: GNU Free Documentation License 1.3
 +  * Web: http://​szit.hu
 +
 +
 +
 +
 +===== 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ő.
 +
 +
 +<code c 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);​
 +}
 +</​code>​
 +
 +Fordítás:
 +  gcc -o demon demon.c
 +
 +Futtatás:
 +  ./demon
 +
 +Leállítás:​
 +  kiallall demon
 +
 +</​code>​
 +
 +
 +
 +
 +
 +===== Egyszerű fájlba író démon =====
 +
 +<code c 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);
 +}
 +
 +</​code>​
 +
 +
 +Fordítás:
 +  gcc -o demon demon.c
 +
 +Futtatás:
 +  ./demon
 +
 +===== Forrás =====
 +  * http://​www.netzmafia.de/​skripten/​unix/​linux-daemon-howto.html (2018)
 +  * http://​www.microhowto.info/​howto/​cause_a_process_to_become_a_daemon_in_c.html (2018)
 +  * https://​www.brettlischalk.com/​posts/​linux-daemon (2018)
oktatas/linux/demon_programozasa.txt · Utolsó módosítás: 2019/08/16 21:30 szerkesztette: admin