Demoni so procesi, ki se ne izvajajo neposredno pod nadzorom uporabnika, ampak delujejo v ozadju. Običajno se začnejo ob zagonu sistema in delujejo neprekinjeno, dokler se sistem ne izklopi. Edina razlika med temi in običajnimi procesi je, da na noben način ne pošiljajo sporočil na konzolo ali zaslon.
Tukaj je opisano, kako lahko ustvarite demona na računalniku z Linuxom.
Kratek uvod v ustvarjanje demonov
V sistemu teče veliko demonov in nekateri znani primeri demonov so naslednji:
- crond: Omogoča izvajanje ukazov ob določenem času
- sshd: Omogoča prijavo v sistem z oddaljenih računalnikov
- httpd: Služi spletnim stranem
- nfsd: Omogoča skupno rabo datotek prek omrežja
Prav tako so procesi demona običajno poimenovani tako, da se končajo s črko d, čeprav ni obvezno.
Če želite, da se proces izvaja kot demon, sledite naslednji poti:
- Začetne operacije, kot je branje konfiguracijskih datotek ali pridobivanje potrebnih sistemskih virov, je treba izvesti, preden proces postane demon. Tako lahko sistem uporabniku sporoči prejete napake in postopek se zaključi z ustrezno kodo napake.
- Proces, ki se izvaja v ozadju, je ustvarjen z init kot nadrejenim procesom. V ta namen se podproces najprej razcepi iz procesa init, nato pa se zgornji proces zaključi z izhodom.
- Nova seja bi se morala odpreti s klicem funkcije setsid, proces pa je treba prekiniti s terminalom.
- Vsi deskriptorji odprtih datotek, podedovani od nadrejenega procesa, so zaprti.
- Standardni vhod, izhod, sporočila o napakah pa so preusmerjena na /dev/null.
- Delovni imenik procesa se mora spremeniti.
Kaj so Daemon Sessions?
Po prijavi v sistem prek terminala lahko uporabniki prek programa lupine zaženejo številne aplikacije. Ti procesi se morajo zapreti, ko uporabnik zapusti sistem. Operacijski sistem te procese združuje v skupine sej in procesov.
Vsaka seja je sestavljena iz procesnih skupin. To situacijo lahko opišete na naslednji način:
Terminal, kjer procesi sprejemajo svoje vhode in pošiljajo svoje izhode, se imenuje nadzorni terminal. Krmilni terminal je povezan samo z eno sejo naenkrat.
Seja in procesne skupine v njej imajo identifikacijske (ID) številke; te identifikacijske številke so identifikacijske številke procesa (PID) vodij seje in procesnih skupin. Podrejeni proces deli isto skupino kot njegov nadrejeni proces. Ko je več procesov komuniciranje s cevnim mehanizmom, prvi proces postane vodja procesne skupine.
Ustvarjanje demonskega procesa v Linuxu
Tukaj boste videli, kako lahko ustvarite demonsko funkcijo. V ta namen boste ustvarili funkcijo z imenom _daemon. Začnete lahko s poimenovanjem kode aplikacije, ki se bo izvajala kot demon test.cin kodo, kot boste ustvarili demonsko funkcijo daemon.c.
//test.c
#vključi <stdio.h>
int_daemon(int, int);
intglavni()
{
getchar();
_daemon (0, 0);
getchar();
vrnitev0;
}
//daemon.c
#vključi <sys/vrste.h>
#vključi <sys/stat.h>
#vključi <stdlib.h>
#vključi <stdio.h>
#vključi <fcntl.h>
#vključi <unistd.h>
#vključi <linux/fs.h>
#vključi <linux/limits.h>
int_daemon(int nochdir, int noclose){
pid_t pid;
pid = vilice(); // Odcepi nadrejeni proces
če (pid < 0) {
izhod(EXIT_FAILURE);
}
če (pid > 0) {
izhod(IZHOD_SUCCESS);
}
vrnitev0;
}
Če želite ustvariti demon, potrebujete proces v ozadju, katerega nadrejeni proces je init. V zgornji kodi, _daemon ustvari podrejeni proces in nato ubije nadrejeni proces. V tem primeru bo vaš novi proces podproces init in se bo še naprej izvajal v ozadju.
Zdaj prevedite aplikacijo z naslednjim ukazom in preglejte stanje procesa pred in po _deamon se imenuje:
gcc-otesttest.cdemon.c
Zaženite aplikacijo in preklopite na drug terminal, ne da bi pritisnili katero koli drugo tipko:
./test
Vidite lahko, da so vrednosti, povezane z vašim procesom, naslednje. Tukaj boste morali uporabiti ukaz ps za pridobitev informacij, povezanih s procesom. V tem primeru je _daemon funkcija še ni bila poklicana.
ps -C test -o "pid ppid pgid sid tty statukaz"
# Izhod
PID PPID PGID SID TT STAT UKAZ
10296 5119 10296 5117 točk/2 S+ ./test
Ko pogledate na STAT polje, vidite, da se vaš proces izvaja, vendar čaka na dogodek izven urnika, zaradi katerega se bo izvajal v ospredju.
Okrajšava | Pomen |
S | Čakanje na spanje, da se zgodi dogodek |
T | Aplikacija je ustavljena |
s | Vodja seje |
+ | Aplikacija teče v ospredju |
Vidite lahko, da je nadrejeni proces vaše aplikacije lupina, kot je pričakovano.
ps -jp 5119
# Izhod
PID PGID SID TTY ČAS CMD
5119 5119 5117 točk/2 00:00:02 zsh
Zdaj se vrnite na terminal, kjer izvajate svojo aplikacijo, in pritisnite Vnesite priklicati _daemon funkcijo. Nato ponovno poglejte informacije o procesu na drugem terminalu.
ps -C test -o "pid ppid pgid sid tty statukaz"
# Izhod
PID PPID PGID SID TT STAT UKAZ
22504 1 22481 5117 točk/2 S ./test
Najprej lahko rečete, da se novi podproces izvaja v ozadju, saj ne vidite + lik v STAT polje. Zdaj preglejte, kdo je nadrejeni proces procesa z naslednjim ukazom:
ps -jp 1
# Izhod
PID PGID SID TTY ČAS CMD
1 1 1? 00:00:01systemd
Zdaj lahko vidite, da je nadrejeni proces vašega procesa systemd proces. Zgoraj je omenjeno, da se mora za naslednji korak odpreti nova seja in proces odklopiti od nadzornega terminala. Za to uporabite funkcijo setsid. Dodajte ta klic v svoj _daemon funkcijo.
Del kode, ki ga je treba dodati, je naslednji:
če (setsid() == -1)
vrnitev-1;
Zdaj, ko ste že pregledali stanje _daemon klicano, zdaj lahko odstranite prvo getchar funkcijo v test.c Koda.
//test.c
#vključi <stdio.h>
int_daemon(int, int);
intglavni()
{
_daemon (0, 0);
getchar();
vrnitev0;
}
Po prevajanju in ponovnem zagonu aplikacije pojdite na terminal, kjer ste naredili svoje ocene. Novo stanje vašega procesa je naslednje:
ps -C test -o "pid ppid pgid sid tty statukaz"
# Izhod
PID PPID PGID SID TT STAT UKAZ
25494 1 25494 25494? Ss ./test
The ? prijavite se v TT polje označuje, da vaš proces ni več povezan s terminalom. Upoštevajte, da je PID, PGID, in SID vrednote vašega procesa so enake. Vaš proces je zdaj vodja seje.
V naslednjem koraku spremenite delovni imenik v korenski imenik glede na vrednost argumenta, ki ste ga posredovali. Naslednji delček lahko dodate v _daemon funkcija za to:
če (!nochdir) {
če (chdir("/") == -1)
vrnitev-1;
}
Zdaj lahko glede na posredovani argument zaprete vse deskriptorje datotek. Dodajte naslednjo kodo v _daemon funkcija:
#define NR_OPEN 1024
če (!noclose) {
za (i = 0; jaz < NR_OPEN; i++)
zapreti (i);
odprto("/dev/nič", O_RDWR);
dup (0);
dup (0);
}
Ko so vsi deskriptorji datotek zaprti, bodo nove datoteke, ki jih je odprl demon, prikazane z deskriptorji 0, 1 in 2. V tem primeru je npr printf ukazi v kodi bodo usmerjeni v drugo odprto datoteko. Da bi se temu izognili, prvi trije identifikatorji kažejo na /dev/null napravo.
V tem primeru je končno stanje _daemon funkcija bo naslednja:
#vključi <sys/vrste.h>
#vključi <sys/stat.h>
#vključi <stdio.h>
#vključi <stdlib.h>
#vključi <fcntl.h>
#vključi <errno.h>
#vključi <unistd.h>
#vključi <syslog.h>
#vključi <niz.h>
int_daemon(nična){
// PID: ID procesa
// SID: ID seje
pid_t pid, sid;
pid = vilice(); // Odcepi nadrejeni proces
če (pid < 0) {
izhod(EXIT_FAILURE);
}
če (pid > 0) {
izhod(IZHOD_SUCCESS);
}
// Ustvari a SIDzaotrok
sid = setsid();
če (sid < 0) {
// FAIL
izhod(EXIT_FAILURE);
}
če ((chdir("/")) < 0) {
// FAIL
izhod(EXIT_FAILURE);
}
zapri (STDIN_FILENO);
zapri (STDOUT_FILENO);
zapri (STDERR_FILENO);
medtem (1) {
// Nekaj nalog
spanje (30);
}
izhod(IZHOD_SUCCESS);
}
Tukaj je primer delčka kode, ki zažene sshd aplikacija kot a demon:
...
če (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
če (demon (0, 0) < 0)
usodno ("daemon() ni uspel: %.200s", strerror (errno));
/* Prekini povezavo z nadzornim tty. */
fd = odprt (_PATH_TTY, O_RDWR | O_NOCTTY);
če (fd >= 0) {
(nična) ioctl (fd, TIOCNOTTY, NULL);
zapreti (fd);
}
}
...
Demoni so pomembni za sistemsko programiranje Linux
Demoni so programi, ki izvajajo različna dejanja na vnaprej določen način, določena kot odziv na določene dogodke. Na vašem računalniku Linux delujejo tiho. Niso pod neposrednim nadzorom uporabnika in vsaka storitev, ki se izvaja v ozadju, ima svojega demona.
Pomembno je, da obvladate demone, da se naučite strukture jedra operacijskega sistema Linux in razumete delovanje različnih sistemskih arhitektur.
Kaj je daemon?
Preberite Naprej
Povezane teme
- Linux
- Jedro Linuxa
- Programiranje
- C Programiranje
O avtorju
Inženir in razvijalec programske opreme, ki je ljubitelj matematike in tehnologije. Od nekdaj je imel rad računalništvo, matematiko in fiziko. Razvil je projekte motorjev za igre, pa tudi strojno učenje, umetne nevronske mreže in knjižnice linearne algebre. Poleg tega še naprej dela na strojnem učenju in linearnih matrikah.
Naročite se na naše novice
Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e-knjige in ekskluzivne ponudbe!
Kliknite tukaj, da se naročite