A démonok olyan folyamatok, amelyek nem közvetlenül a felhasználó irányítása alatt futnak, hanem a háttérben szolgálnak. Általában a rendszer indításakor indulnak el, és folyamatosan futnak, amíg a rendszer le nem áll. Az egyetlen különbség ezek és a normál folyamatok között, hogy semmilyen módon nem küldenek üzenetet a konzolra vagy a képernyőre.
Így hozhat létre démont Linux gépen.
A démonok létrehozásának rövid bemutatása
Sok démon fut a rendszeren, és néhány ismerős démon példa a következő:
- crond: A parancsokat a megadott időpontban futtatja
- sshd: Lehetővé teszi a bejelentkezést a rendszerbe távoli gépekről
- httpd: Weboldalakat szolgál ki
- nfsd: Lehetővé teszi a hálózaton keresztüli fájlmegosztást
Ezenkívül a démonfolyamatok elnevezése általában a betűvel végződik d, bár nem kötelező.
Ahhoz, hogy egy folyamat démonként fusson, a következő útvonalat kell követni:
- A kezdeti műveleteket, például a konfigurációs fájlok beolvasását vagy a szükséges rendszererőforrások megszerzését el kell végezni, mielőtt a folyamat démonná válna. Így a rendszer a kapott hibákat jelenteni tudja a felhasználónak, és a folyamat megfelelő hibakóddal leáll.
- Létrejön egy háttérben futó folyamat, amelynek szülőfolyamata az init. Ebből a célból először az init folyamatból egy részfolyamatot leágazunk, majd a felső folyamatot a kilépéssel lezárjuk.
- A setsid függvény meghívásával új szekciónak kell megnyílnia, és a folyamatot le kell választani a terminálról.
- A szülőfolyamattól örökölt összes nyitott fájlleíró zárva van.
- Normál bemenet, kimenet, és a hibaüzenetek ide kerülnek átirányításra /dev/null.
- A folyamat munkakönyvtárának meg kell változnia.
Mik azok a démon munkamenetek?
Miután terminálon keresztül bejelentkeztek a rendszerbe, a felhasználók számos alkalmazást futtathatnak a shell programon keresztül. Ezeknek a folyamatoknak be kell zárniuk, amikor a felhasználó kilép a rendszerből. Az operációs rendszer ezeket a folyamatokat munkamenet- és folyamatcsoportokba csoportosítja.
Minden munkamenet folyamatcsoportokból áll. Ezt a helyzetet a következőképpen írhatja le:
Azt a terminált, ahol a folyamatok fogadják a bemeneteiket és elküldik a kimeneteiket, vezérlő terminálnak nevezzük. Egy vezérlő terminál egyszerre csak egy munkamenethez van társítva.
Egy munkamenet és a benne lévő folyamatcsoportok azonosító (ID) számmal rendelkeznek; ezek az azonosító számok a munkamenet- és folyamatcsoport-vezetők folyamatazonosító számai (PID). Egy gyermekfolyamat ugyanazon a csoporton osztozik, mint a szülőfolyamat. Amikor több folyamat van kommunikál a csőmechanizmussal, az első folyamat a folyamatcsoport vezetője lesz.
Démon folyamat létrehozása Linuxon
Itt láthatja, hogyan hozhat létre démonfüggvényt. Erre a célra létre kell hozni egy nevű függvényt _démon. Kezdje azzal, hogy a démonként futó alkalmazáskódot a következő néven nevezi el teszt.c, és a kód, amellyel a démonfüggvényt létrehozni fogja démon.c.
//test.c
#beleértve <stdio.h>
int_démon(int, int);
intfő-()
{
getchar();
_daemon (0, 0);
getchar();
Visszatérés0;
}
//daemon.c
#beleértve <sys/types.h>
#beleértve <sys/stat.h>
#beleértve <stdlib.h>
#beleértve <stdio.h>
#beleértve <fcntl.h>
#beleértve <unistd.h>
#beleértve <linux/fs.h>
#beleértve <linux/limits.h>
int_démon(int nochdir, int noclose){
pid_t pid;
pid = villa(); // Forgasd le a szülő folyamatot
ha (pid < 0) {
kijárat(EXIT_FAILURE);
}
ha (pid > 0) {
kijárat(EXIT_SIKER);
}
Visszatérés0;
}
Démon létrehozásához olyan háttérfolyamatra van szükség, amelynek szülőfolyamata az init. A fenti kódban _démon létrehoz egy gyermek folyamatot, majd megöli a szülő folyamatot. Ebben az esetben az új folyamat az init alfolyamata lesz, és továbbra is a háttérben fut.
Most fordítsa le az alkalmazást a következő paranccsal, és vizsgálja meg a folyamat előtti és utáni állapotát _deamon nak, nek hívják:
gcc-otesztteszt.cdémon.c
Futtassa az alkalmazást, és váltson másik terminálra anélkül, hogy megnyomna más gombot:
./teszt
Láthatja, hogy a folyamathoz kapcsolódó értékek a következők. Itt kell használni a ps parancs a folyamattal kapcsolatos információk lekéréséhez. Ebben az esetben a _démon függvény még nem lett meghívva.
ps -C teszt -o "pid ppid pgid sid tty statisztikaparancs"
# Kimenet
PID PPID PGID SID TT STAT Parancs
10296 5119 10296 5117 pt/2 S+ ./teszt
Amikor ránézel a STATISZTIKA mezőben azt látja, hogy a folyamat fut, de vár egy nem ütemezett eseményre, amely miatt a folyamat az előtérben fut.
Rövidítés | Jelentése |
S | Alvásban várja, hogy megtörténjen egy esemény |
T | Az alkalmazás leállt |
s | Munkamenet vezetője |
+ | Az alkalmazás az előtérben fut |
Láthatja, hogy az alkalmazás szülőfolyamata a várt shell.
ps -jp 5119
# Kimenet
PID PGID SID TTY IDŐ CMD
5119 5119 5117 pts/2 00:00:02 zsh
Most térjen vissza a terminálhoz, ahol az alkalmazást futtatja, és nyomja meg a gombot Belép hivatkozni a _démon funkció. Ezután nézze meg újra a folyamatinformációkat a másik terminálon.
ps -C teszt -o "pid ppid pgid sid tty statisztikaparancs"
# Kimenet
PID PPID PGID SID TT STAT Parancs
22504 1 22481 5117 pts/2 S ./teszt
Először is elmondhatja, hogy az új alfolyamat a háttérben fut, mivel nem látja a + karakter a STATISZTIKA terület. Most vizsgálja meg, hogy ki a folyamat szülőfolyamata a következő paranccsal:
ps -jp 1
# Kimenet
PID PGID SID TTY IDŐ CMD
1 1 1? 00:00:01systemd
Most már láthatja, hogy a folyamat szülőfolyamata a systemd folyamat. Fentebb említettük, hogy a következő lépéshez új munkamenetnek kell megnyílnia, és a folyamatot le kell választani a vezérlőterminálról. Ehhez használja a setsid függvényt. Adja hozzá ezt a hívást a sajátjához _démon funkció.
A hozzáadandó kódrészlet a következő:
if (setsid() == -1)
Visszatérés-1;
Most, hogy korábban ellenőrizte az államot _démon hívják, most eltávolíthatja az elsőt getchar funkció a teszt.c kód.
//test.c
#beleértve <stdio.h>
int_démon(int, int);
intfő-()
{
_daemon (0, 0);
getchar();
Visszatérés0;
}
Az alkalmazás összeállítása és újbóli futtatása után lépjen arra a terminálra, ahol az értékeléseket készítette. A folyamat új állapota a következő:
ps -C teszt -o "pid ppid pgid sid tty statisztikaparancs"
# Kimenet
PID PPID PGID SID TT STAT Parancs
25494 1 25494 25494? Ss ./teszt
A ? jelentkezzen be a TT mező azt jelzi, hogy a folyamat már nem csatlakozik terminálhoz. Vegyük észre, hogy a PID, PGID, és SID a folyamat értékei azonosak. Az Ön folyamata mostantól munkamenet-vezető.
A következő lépésben módosítsa a munkakönyvtárat a gyökérkönyvtárra az átadott argumentum értékének megfelelően. A következő részletet hozzáadhatja a _démon funkció ehhez:
if (!nochdir) {
if (chdir("/") == -1)
Visszatérés-1;
}
Most az elfogadott érv szerint az összes fájlleíró bezárható. Adja hozzá a következő kódot a _démon funkció:
#define NR_OPEN 1024
if (!noclose) {
for (i = 0; én < NR_OPEN; én++)
bezár (i);
nyisd ki("/dev/nulla", O_RDWR);
dup (0);
dup (0);
}
Az összes fájlleíró bezárása után a démon által megnyitott új fájlok 0, 1 és 2 leírókkal jelennek meg. Ebben az esetben például a printf a kódban lévő parancsok a második megnyitott fájlba kerülnek. Ennek elkerülése érdekében az első három azonosító a /dev/null eszköz.
Ebben az esetben a végső állapot a _démon a funkció a következő lesz:
#beleértve <sys/types.h>
#beleértve <sys/stat.h>
#beleértve <stdio.h>
#beleértve <stdlib.h>
#beleértve <fcntl.h>
#beleértve <errno.h>
#beleértve <unistd.h>
#beleértve <syslog.h>
#beleértve <húr.h>
int_démon(üres){
// PID: Folyamatazonosító
// SID: Session ID
pid_t pid, sid;
pid = villa(); // Forgasd le a szülő folyamatot
ha (pid < 0) {
kijárat(EXIT_FAILURE);
}
ha (pid > 0) {
kijárat(EXIT_SIKER);
}
// Teremt a SIDszámáragyermek
sid = setsid();
ha (sid < 0) {
// FAIL
kijárat(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// FAIL
kijárat(EXIT_FAILURE);
}
bezár (STDIN_FILENO);
bezárás (STDOUT_FILENO);
bezár (STDERR_FILENO);
míg (1) {
// Néhány feladat
alvás (30);
}
kijárat(EXIT_SIKER);
}
Íme egy példa egy kódrészletre, amely a sshd alkalmazás, mint a démon:
...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (démon (0, 0) < 0)
halálos("daemon() sikertelen: %.200s", strerror (errno));
/* Lekapcsolódás a vezérlő tty-ről. */
fd = nyitott (_PATH_TTY, O_RDWR | O_NOCTTY);
if (fd >= 0) {
(üres) ioctl (fd, TIOCNOTTY, NULL);
bezár (fd);
}
}
...
A démonok fontosak a Linux rendszerprogramozáshoz
A démonok olyan programok, amelyek különféle műveleteket hajtanak végre előre meghatározott módon, bizonyos eseményekre válaszul. Csendesen futnak a Linux gépén. Nem tartoznak közvetlenül a felhasználó irányítása alá, és minden háttérben futó szolgáltatásnak megvan a maga démonja.
Fontos a démonok elsajátítása a Linux operációs rendszer kernelszerkezetének megismeréséhez és a különféle rendszerarchitektúrák működésének megértéséhez.
Mi az a démon?
Olvassa el a következőt
Kapcsolódó témák
- Linux
- Linux Kernel
- Programozás
- C Programozás
A szerzőről

Mérnök és szoftverfejlesztő, aki a matematika és a technológia rajongója. Mindig is szerette a számítógépeket, a matematikát és a fizikát. Játékmotor-projekteket, valamint gépi tanulást, mesterséges neurális hálózatokat és lineáris algebra-könyvtárakat fejlesztett ki. Továbbá továbbra is dolgozik a gépi tanuláson és a lineáris mátrixokon.
Iratkozzon fel hírlevelünkre
Csatlakozzon hírlevelünkhöz műszaki tippekért, ismertetőkért, ingyenes e-könyvekért és exkluzív ajánlatokért!
Kattintson ide az előfizetéshez