Démoni sú procesy, ktoré nebežia priamo pod kontrolou používateľa, ale slúžia na pozadí. Zvyčajne sa spúšťajú pri štarte systému a bežia nepretržite, kým sa systém nevypne. Jediný rozdiel medzi týmito a normálnymi procesmi je v tom, že žiadnym spôsobom neposielajú správy do konzoly alebo obrazovky.

Tu je návod, ako môžete vytvoriť démona na počítači so systémom Linux.

Stručný úvod o tom, ako sa vytvárajú démoni

V systéme beží veľa démonov a niektoré známe príklady démonov sú nasledovné:

  • crond: Spustí príkazy v určenom čase
  • sshd: Umožňuje prihlásenie do systému zo vzdialených počítačov
  • httpd: Zobrazuje webové stránky
  • nfsd: Umožňuje zdieľanie súborov cez sieť

Procesy démonov sú tiež zvyčajne pomenované tak, aby končili písmenom d, aj keď to nie je povinné.

Aby sa proces spúšťal ako démon, postupujte podľa nasledujúcej cesty:

  • Počiatočné operácie, ako je čítanie konfiguračných súborov alebo získanie potrebných systémových prostriedkov, sa musia vykonať skôr, ako sa proces stane démonom. Týmto spôsobom môže systém nahlásiť prijaté chyby používateľovi a proces bude ukončený s príslušným kódom chyby.
    instagram viewer
  • Vytvorí sa proces spustený na pozadí, ktorého nadradeným procesom je init. Na tento účel sa z procesu init najprv rozdelí podproces a potom sa horný proces ukončí ukončením.
  • Nová relácia by sa mala otvoriť volaním funkcie setsid a proces by sa mal odpojiť od terminálu.
  • Všetky deskriptory otvorených súborov zdedené z nadradeného procesu sú zatvorené.
  • Štandardný vstup, výstupa chybové hlásenia sú presmerované na /dev/null.
  • Pracovný adresár procesu sa musí zmeniť.

Čo sú to relácie démonov?

Po prihlásení do systému cez terminál môžu používatelia spúšťať mnoho aplikácií prostredníctvom programu shell. Tieto procesy by sa mali ukončiť, keď používateľ opustí systém. Operačný systém zoskupuje tieto procesy do skupín relácií a procesov.

Každá relácia pozostáva zo skupín procesov. Túto situáciu môžete opísať takto:

Terminál, kde procesy prijímajú svoje vstupy a odosielajú svoje výstupy, sa nazýva riadiaci terminál. Riadiaci terminál je spojený iba s jednou reláciou naraz.

Relácia a skupiny procesov v nej majú identifikačné (ID) čísla; tieto identifikačné čísla sú identifikačné čísla procesu (PID) vedúcich relácií a procesných skupín. Podradený proces zdieľa rovnakú skupinu ako jeho nadradený proces. Keď je viacero procesov komunikácia s potrubným mechanizmom, prvý proces sa stáva vedúcim procesnej skupiny.

Vytvorenie procesu démona v systéme Linux

Tu uvidíte, ako môžete vytvoriť funkciu démona. Na tento účel vytvoríte funkciu s názvom _démon. Môžete začať pomenovaním kódu aplikácie, ktorá bude bežať ako démon ako test.ca kód, pod ktorým vytvoríte funkciu démona daemon.c.

//test.c
#include <stdio.h>
int_démon(int, int);
intHlavná()
{
getchar();
_daemon (0, 0);
getchar();
vrátiť0;
}
//daemon.c
#include <sys/typy.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
#include <linux/limits.h>
int_démon(int nochdir, int noclose){
pid_t pid;
pid = vidlica (); // Rozvetvenie nadradeného procesu
ak (pid < 0) {
VÝCHOD(EXIT_FAILURE);
}
ak (pid > 0) {
VÝCHOD(EXIT_SUCCESS);
}
vrátiť0;
}

Na vytvorenie démona potrebujete proces na pozadí, ktorého nadradený proces je init. Vo vyššie uvedenom kóde _démon vytvorí podriadený proces a potom zabije nadradený proces. V tomto prípade bude váš nový proces podprocesom init a bude naďalej bežať na pozadí.

Teraz skompilujte aplikáciu pomocou nasledujúceho príkazu a skontrolujte stav procesu pred a po _deamon sa volá:

gcc-otestovaťtestovať.cdémon.c

Spustite aplikáciu a prepnite sa na iný terminál bez stláčania akýchkoľvek iných kláves:

./testovať

Môžete vidieť, že hodnoty súvisiace s vaším procesom sú nasledovné. Tu budete musieť použiť príkaz ps na získanie informácií súvisiacich s procesom. V tomto prípade, _démon funkcia ešte nebola vyvolaná.

ps -C testovať -o "pid ppid pgid sid tty statpríkaz"
# Výkon
PID PPID PGID SID TT STAT COMMAND
10296 5119 10296 5117 bodov/2 S+ ./testovať

Keď sa pozriete na STAT vidíte, že váš proces beží, ale čaká na udalosť mimo plánu, ktorá spôsobí jeho spustenie v popredí.

Skratka Význam
S Čakanie v spánku na udalosť
T Aplikácia bola zastavená
s Vedúci relácie
+ Aplikácia beží v popredí

Môžete vidieť, že nadradený proces vašej aplikácie je podľa očakávania shell.

ps -jp 5119 
# Výkon
PID PGID SID TTY ČAS CMD
5119 5119 5117 bodov/2 00:00:02 zsh

Teraz sa vráťte do terminálu, kde máte spustenú aplikáciu, a stlačte Zadajte dovolať sa _démon funkciu. Potom sa znova pozrite na informácie o procese na druhom termináli.

ps -C testovať -o "pid ppid pgid sid tty statpríkaz"
# Výkon
PID PPID PGID SID TT STAT COMMAND
22504 1 22481 5117 bodov/2 S ./testovať

V prvom rade môžete povedať, že nový podproces beží na pozadí, pretože ho nevidíte + charakter v STAT lúka. Teraz skontrolujte, kto je nadradený proces procesu pomocou nasledujúceho príkazu:

ps -jp 1 
​​​​​​​# Výkon
PID PGID SID TTY ČAS CMD
1 1 1? 00:00:01systemd

Teraz môžete vidieť, že nadradený proces vášho procesu je systemd proces. Vyššie je uvedené, že pre ďalší krok by sa mala otvoriť nová relácia a proces by sa mal odpojiť od riadiaceho terminálu. Na tento účel použite funkciu setsid. Pridajte tento hovor do svojho _démon funkciu.

Kus kódu, ktorý sa má pridať, je nasledujúci:

if (setsid() == -1) 
vrátiť-1;

Teraz, keď ste už predtým skontrolovali stav _démon volaného, ​​teraz môžete odstrániť prvého getchar funkciu v test.c kód.

//test.c
#include <stdio.h>
int_démon(int, int);
intHlavná()
{
_daemon (0, 0);
getchar();
vrátiť0;
}

Po skompilovaní a opätovnom spustení aplikácie prejdite na terminál, kde ste urobili svoje recenzie. Nový stav vášho procesu je nasledujúci:

ps -C testovať -o "pid ppid pgid sid tty statpríkaz"
​​​​​​​# Výkon
PID PPID PGID SID TT STAT COMMAND
25494 1 25494 25494? Ss ./testovať

The ? prihláste sa TT pole označuje, že váš proces už nie je pripojený k terminálu. Všimnite si, že PID, PGIDa SID hodnoty vášho procesu sú rovnaké. Váš proces je teraz vedúci relácie.

V ďalšom kroku zmeňte pracovný adresár na koreňový adresár podľa hodnoty argumentu, ktorý ste zadali. Do súboru môžete pridať nasledujúci úryvok _démon funkcia na to:

if (!nochdir) {
if (chdir("/") == -1)
vrátiť-1;
}

Teraz, podľa odovzdaného argumentu, môžu byť všetky deskriptory súborov zatvorené. Pridajte nasledujúci kód do _démon funkcia:

#define NR_OPEN 1024
if (!nocclose) {
pre (i = 0; i < NR_OPEN; i++)
zavrieť (i);
OTVORENÉ("/dev/nulový", O_RDWR);
dup (0);
dup (0);
}

Po zatvorení všetkých deskriptorov súborov sa nové súbory otvorené démonom zobrazia s deskriptormi 0, 1 a 2. V tomto prípade napr printf príkazy v kóde budú smerované do druhého otvoreného súboru. Aby sa tomu zabránilo, prvé tri identifikátory ukazujú na /dev/null zariadenie.

V tomto prípade je konečný stav _démon funkcia bude nasledovná:

#include <sys/typy.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <reťazec.h>
int_démon(neplatné){
// PID: ID procesu
// SID: ID relácie
pid_t pid, sid;
pid = vidlica (); // Rozvetvenie nadradeného procesu
ak (pid < 0) {
VÝCHOD(EXIT_FAILURE);
}
ak (pid > 0) {
VÝCHOD(EXIT_SUCCESS);
}
// Vytvorte a SIDpredieťa
sid = setsid ();
ak (sid < 0) {
// FAIL
VÝCHOD(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// FAIL
VÝCHOD(EXIT_FAILURE);
}
zavrieť (STDIN_FILENO);
zavrieť (STDOUT_FILENO);
zavrieť (STDERR_FILENO);
zatiaľ čo (1) {
// Niektoré úlohy
spánok (30);
}
VÝCHOD(EXIT_SUCCESS);
}

Tu je príklad útržku kódu, ktorý spúšťa sshd aplikácia ako a démon:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (démon (0, 0) < 0)
smrteľné ("daemon() zlyhal: %.200s", strerror (errno));
/* Odpojenie od riadiaceho tty. */
fd = otvorené (_PATH_TTY, O_RDWR | O_NOCTTY);
ak (fd >= 0) {
(neplatné) ioctl (fd, TIOCNOTTY, NULL);
zavrieť (fd);
}
}
...

Démoni sú dôležité pre programovanie systému Linux

Démoni sú programy, ktoré vykonávajú rôzne akcie preddefinovaným spôsobom nastaveným v reakcii na určité udalosti. Na vašom počítači so systémom Linux bežia ticho. Nie sú pod priamou kontrolou používateľa a každá služba bežiaca na pozadí má svojho démona.

Je dôležité ovládať démonov, aby ste sa naučili štruktúru jadra operačného systému Linux a porozumeli fungovaniu rôznych systémových architektúr.

Čo je to démon?

Prečítajte si ďalej

zdieľamTweetujtezdieľamEmail

Súvisiace témy

  • Linux
  • Linuxové jadro
  • Programovanie
  • C Programovanie

O autorovi

Fatih Küçükkarakurt (5 publikovaných článkov)

Inžinier a vývojár softvéru, ktorý je fanúšikom matematiky a technológií. Vždy mal rád počítače, matematiku a fyziku. Vyvinul projekty herných motorov, ako aj strojové učenie, umelé neurónové siete a knižnice lineárnej algebry. Okrem toho pokračuje v práci na strojovom učení a lineárnych matriciach.

Viac od Fatiha Küçükkarakurta

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné e-knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber