Démoni jsou procesy, které neprobíhají přímo pod kontrolou uživatele, ale slouží na pozadí. Obvykle se spouštějí při spuštění systému a běží nepřetržitě, dokud se systém nevypne. Jediný rozdíl mezi těmito a normálními procesy je v tom, že žádným způsobem neposílají zprávy do konzole nebo obrazovky.
Zde je návod, jak vytvořit démona na počítači se systémem Linux.
Stručný úvod do toho, jak se vytvářejí démoni
V systému běží mnoho démonů a některé známé příklady démonů jsou následující:
- crond: Zajistí spuštění příkazů v určený čas
- sshd: Umožňuje přihlášení do systému ze vzdálených počítačů
- httpd: Poskytuje webové stránky
- nfsd: Umožňuje sdílení souborů po síti
Procesy démonů jsou také obvykle pojmenovány tak, aby končily písmenem d, i když to není povinné.
Aby proces běžel jako démon, postupujte takto:
- Počáteční operace, jako je čtení konfiguračních souborů nebo získání nezbytných systémových prostředků, musí být provedeny dříve, než se proces stane démonem. Tímto způsobem může systém nahlásit přijaté chyby uživateli a proces bude ukončen s příslušným chybovým kódem.
- Je vytvořen proces běžící na pozadí s init jako nadřazeným procesem. Za tímto účelem je z procesu init nejprve rozvětven dílčí proces a poté je horní proces ukončen ukončením.
- Nová relace by se měla otevřít voláním funkce setsid a proces by měl být odpojen od terminálu.
- Všechny otevřené deskriptory souborů zděděné z nadřazeného procesu jsou uzavřeny.
- Standardní vstup, výstupa chybové zprávy jsou přesměrovány na /dev/null.
- Pracovní adresář procesu se musí změnit.
Co jsou to démonické relace?
Po přihlášení do systému přes terminál mohou uživatelé spouštět mnoho aplikací prostřednictvím programu shell. Tyto procesy by se měly zavřít, když uživatel opustí systém. Operační systém seskupuje tyto procesy do skupin relací a procesů.
Každá relace se skládá ze skupin procesů. Tuto situaci můžete popsat následovně:
Terminál, kde procesy přijímají své vstupy a odesílají své výstupy, se nazývá řídicí terminál. Řídicí terminál je spojen vždy pouze s jednou relací.
Relace a skupiny procesů v ní mají identifikační (ID) čísla; tato identifikační čísla jsou identifikační čísla procesu (PID) vedoucích relace a procesních skupin. Podřízený proces sdílí stejnou skupinu jako jeho nadřazený proces. Když je více procesů komunikace s potrubním mechanismem, první proces se stává vedoucím procesní skupiny.
Vytvoření procesu démona v systému Linux
Zde uvidíte, jak můžete vytvořit funkci démona. Za tímto účelem vytvoříte funkci s názvem _démon. Můžete začít pojmenováním kódu aplikace, která poběží jako démon jako test.ca kód, pod kterým vytvoříte funkci démona daemon.c.
//test.c
#zahrnout <stdio.h>
int_démon(int, int);
inthlavní()
{
getchar();
_daemon (0, 0);
getchar();
vrátit se0;
}
//daemon.c
#zahrnout <sys/types.h>
#zahrnout <sys/stat.h>
#zahrnout <stdlib.h>
#zahrnout <stdio.h>
#zahrnout <fcntl.h>
#zahrnout <unistd.h>
#zahrnout <linux/fs.h>
#zahrnout <linux/limits.h>
int_démon(int nochdir, int nočník){
pid_t pid;
pid = vidlička(); // Rozvětvení nadřazeného procesu
pokud (pid < 0) {
výstup(EXIT_FAILURE);
}
pokud (pid > 0) {
výstup(EXIT_SUCCESS);
}
vrátit se0;
}
Chcete-li vytvořit démona, potřebujete proces na pozadí, jehož nadřazeným procesem je init. Ve výše uvedeném kódu _démon vytvoří podřízený proces a poté zabije nadřazený proces. V tomto případě bude váš nový proces podprocesem init a bude nadále běžet na pozadí.
Nyní zkompilujte aplikaci pomocí následujícího příkazu a prozkoumejte stav procesu před a po _démon je nazýván:
gcc-Ótesttest.Cdémon.C
Spusťte aplikaci a přepněte na jiný terminál bez stisknutí jakýchkoli dalších kláves:
./test
Můžete vidět, že hodnoty související s vaším procesem jsou následující. Zde budete muset použít příkaz ps k získání informací souvisejících s procesem. V tomto případě _démon funkce ještě nebyla volána.
ps -C test -o "pid ppid pgid sid tty statpříkaz"
# Výstup
PID PPID PGID SID TT STAT PŘÍKAZ
10296 5119 10296 5117 bodů/2 S+ ./test
Když se podíváte na STAT uvidíte, že váš proces běží, ale čeká na událost mimo plán, která způsobí jeho spuštění v popředí.
Zkratka | Význam |
S | Spící čekání na událost |
T | Aplikace zastavena |
s | Vedoucí relace |
+ | Aplikace běží na popředí |
Můžete vidět, že nadřazeným procesem vaší aplikace je podle očekávání shell.
ps -jp 5119
# Výstup
PID PGID SID TTY ČAS CMD
5119 5119 5117 bodů/2 00:00:02 zsh
Nyní se vraťte do terminálu, kde spouštíte aplikaci, a stiskněte Vstupte vyvolat _démon funkce. Poté se znovu podívejte na informace o procesu na druhém terminálu.
ps -C test -o "pid ppid pgid sid tty statpříkaz"
# Výstup
PID PPID PGID SID TT STAT PŘÍKAZ
22504 1 22481 5117 bodů/2 S ./test
Za prvé můžete říci, že nový podproces běží na pozadí, protože nevidíte + postava v STAT pole. Nyní zkontrolujte, kdo je nadřazeným procesem procesu, pomocí následujícího příkazu:
ps -jp 1
# Výstup
PID PGID SID TTY ČAS CMD
1 1 1? 00:00:01systemd
Nyní můžete vidět, že nadřazeným procesem vašeho procesu je systemd proces. Výše je uvedeno, že pro další krok by se měla otevřít nová relace a proces by měl být odpojen od řídicího terminálu. K tomu použijte funkci setsid. Přidejte tento hovor do svého _démon funkce.
Část kódu, kterou je třeba přidat, je následující:
if (setsid() == -1)
vrátit se-1;
Nyní, když jste již dříve zkontrolovali stav _démon zavolal, můžete nyní odstranit první getchar funkce v test.c kód.
//test.c
#zahrnout <stdio.h>
int_démon(int, int);
inthlavní()
{
_daemon (0, 0);
getchar();
vrátit se0;
}
Po zkompilování a opětovném spuštění aplikace přejděte na terminál, kde jste provedli své recenze. Nový stav vašeho procesu je následující:
ps -C test -o "pid ppid pgid sid tty statpříkaz"
# Výstup
PID PPID PGID SID TT STAT PŘÍKAZ
25494 1 25494 25494? ss./test
The ? přihlásit se TT pole označuje, že váš proces již není připojen k terminálu. Všimněte si, že PID, PGID, a SID hodnoty vašeho procesu jsou stejné. Váš proces je nyní vedoucím relace.
V dalším kroku změňte pracovní adresář na kořenový adresář podle hodnoty argumentu, který jste předali. Do souboru můžete přidat následující úryvek _démon funkce pro toto:
if (!nochdir) {
if (chdir("/") == -1)
vrátit se-1;
}
Nyní, podle zaslaného argumentu, mohou být všechny deskriptory souborů uzavřeny. Přidejte následující kód do _démon funkce:
#define NR_OPEN 1024
if (!nocclose) {
pro (i = 0; i < NR_OPEN; i++)
zavřít (i);
OTEVŘENO("/dev/nula", O_RDWR);
dup (0);
dup (0);
}
Po zavření všech deskriptorů souborů se nové soubory otevřené démonem zobrazí s deskriptory 0, 1 a 2 v tomto pořadí. V tomto případě např printf příkazy v kódu budou přesměrovány do druhého otevřeného souboru. Aby se tomu zabránilo, první tři identifikátory ukazují na /dev/null přístroj.
V tomto případě konečný stav _démon funkce bude následující:
#zahrnout <sys/types.h>
#zahrnout <sys/stat.h>
#zahrnout <stdio.h>
#zahrnout <stdlib.h>
#zahrnout <fcntl.h>
#zahrnout <errno.h>
#zahrnout <unistd.h>
#zahrnout <syslog.h>
#zahrnout <řetězec.h>
int_démon(prázdnota){
// PID: ID procesu
// SID: ID relace
pid_t pid, sid;
pid = vidlička(); // Rozvětvení nadřazeného procesu
pokud (pid < 0) {
výstup(EXIT_FAILURE);
}
pokud (pid > 0) {
výstup(EXIT_SUCCESS);
}
// Vytvořit A SIDprodítě
sid = setsid();
pokud (sid < 0) {
// SELHAT
výstup(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// SELHAT
výstup(EXIT_FAILURE);
}
zavřít (STDIN_FILENO);
zavřít (STDOUT_FILENO);
zavřít (STDERR_FILENO);
zatímco (1) {
// Některé úkoly
spánek (30);
}
výstup(EXIT_SUCCESS);
}
Zde je příklad fragmentu kódu, který spouští sshd aplikace jako a démon:
...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (démon (0, 0) < 0)
fatální ("daemon() se nezdařilo: %.200s", strerror (errno));
/* Odpojit se od řídícího tty. */
fd = otevřít (_PATH_TTY, O_RDWR | O_NOCTTY);
pokud (fd >= 0) {
(prázdnota) ioctl (fd, TIOCNOTTY, NULL);
zavřít (fd);
}
}
...
Démoni jsou důležití pro programování systému Linux
Démoni jsou programy, které provádějí různé akce předdefinovaným způsobem nastaveným v reakci na určité události. Na vašem počítači se systémem Linux běží tiše. Nejsou pod přímou kontrolou uživatele a každá služba běžící na pozadí má svého démona.
Je důležité ovládat démony, abyste se naučili strukturu jádra operačního systému Linux a porozuměli fungování různých architektur systému.
Co je to démon?
Přečtěte si další
Související témata
- Linux
- Linuxové jádro
- Programování
- C Programování
O autorovi

Inženýr a vývojář softwaru, který je fanouškem matematiky a technologií. Vždy měl rád počítače, matematiku a fyziku. Vyvinul projekty herních enginů a také strojové učení, umělé neuronové sítě a knihovny lineární algebry. Navíc pokračuje v práci na strojovém učení a lineárních maticích.
Přihlaste se k odběru našeho newsletteru
Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné e-knihy a exkluzivní nabídky!
Chcete-li se přihlásit k odběru, klikněte sem