Daemoni su procesi koji se ne izvode izravno pod kontrolom korisnika, već služe u pozadini. Obično počinju pri pokretanju sustava i rade kontinuirano dok se sustav ne isključi. Jedina razlika između ovih i normalnih procesa je ta što ni na koji način ne šalju poruke na konzolu ili zaslon.

Evo kako možete stvoriti demon na Linux računalu.

Kratak uvod u stvaranje demona

Puno demona radi na sustavu, a neki poznati primjeri demona su sljedeći:

  • crond: Pokreće naredbe u određeno vrijeme
  • sshd: Omogućuje prijavu na sustav s udaljenih računala
  • httpd: Poslužuje web stranice
  • nfsd: Omogućuje dijeljenje datoteka putem mreže

Također, demonski procesi obično se imenuju tako da završavaju slovom d, iako to nije obavezno.

Da bi se proces pokrenuo kao demon, slijedi sljedeći put:

  • Početne operacije, kao što je čitanje konfiguracijskih datoteka ili dobivanje potrebnih resursa sustava, moraju se izvesti prije nego što proces postane demon. Na taj način sustav može prijaviti primljene pogreške korisniku i proces će biti prekinut odgovarajućim kodom pogreške.
  • instagram viewer
  • Pozadinski pokrenuti proces kreira se s init kao nadređenim procesom. U tu svrhu, podproces se prvo račva iz init procesa, a zatim se gornji proces završava izlazom.
  • Nova sesija bi se trebala otvoriti pozivom funkcije setsid, a proces bi trebao biti odspojen s terminala.
  • Svi otvoreni deskriptori datoteka naslijeđeni od nadređenog procesa su zatvoreni.
  • Standardni ulaz, izlaz, a poruke o pogrešci se preusmjeravaju na /dev/null.
  • Radni direktorij procesa se mora promijeniti.

Što su Daemon sesije?

Nakon prijave u sustav putem terminala, korisnici mogu pokrenuti mnoge aplikacije kroz shell program. Ovi bi se procesi trebali zatvoriti kada korisnik izađe iz sustava. Operativni sustav grupira ove procese u grupe sesija i procesa.

Svaka sesija se sastoji od procesnih grupa. Ovu situaciju možete opisati na sljedeći način:

Terminal gdje procesi primaju svoje ulaze i šalju svoje izlaze naziva se kontrolni terminal. Kontrolni terminal povezan je sa samo jednom sesijom u isto vrijeme.

Sesija i procesne grupe u njoj imaju identifikacijske (ID) brojeve; ti identifikacijski brojevi su identifikacijski brojevi procesa (PID) voditelja sesije i procesnih grupa. Podređeni proces dijeli istu grupu kao i njegov roditeljski proces. Kada je više procesa komuniciranje s cijevnim mehanizmom, prvi proces postaje voditelj grupe procesa.

Stvaranje Daemon procesa na Linuxu

Ovdje ćete vidjeti kako možete stvoriti daemon funkciju. U tu svrhu stvorit ćete funkciju pod nazivom _demon. Možete započeti s imenovanjem koda aplikacije koji će se izvoditi kao demon kao test.c, i kod pod kojim ćete kreirati daemon funkciju demon.c.

//test.c
#uključiti <stdio.h>
int_demon(int, int);
intglavni()
{
getchar();
_daemon (0, 0);
getchar();
povratak0;
}
//daemon.c
#uključiti <sys/vrste.h>
#uključiti <sys/stat.h>
#uključiti <stdlib.h>
#uključiti <stdio.h>
#uključiti <fcntl.h>
#uključiti <unistd.h>
#uključiti <linux/fs.h>
#uključiti <linux/ograničenja.h>
int_demon(int nochdir, int zatvoriti){
pid_t pid;
pid = vilica(); // Odvojiti se od roditeljskog procesa
ako (pid < 0) {
Izlaz(IZLAZ_POGREŠKA);
}
ako (pid > 0) {
Izlaz(IZLAZ_USPJEH);
}
povratak0;
}

Za stvaranje demona potreban vam je pozadinski proces čiji je roditeljski proces init. U kodu iznad, _demon stvara podređeni proces, a zatim ubija roditeljski proces. U ovom slučaju, vaš će novi proces biti podproces init i nastavit će se izvoditi u pozadini.

Sada sastavite aplikaciju sa sljedećom naredbom i ispitajte status procesa prije i poslije _deamon Zove se:

gcc-otesttest.cdemon.c

Pokrenite aplikaciju i prijeđite na drugi terminal bez pritiskanja bilo koje druge tipke:

./test

Možete vidjeti da su vrijednosti povezane s vašim procesom sljedeće. Ovdje ćete morati koristiti naredba ps za dobivanje informacija o procesu. U ovom slučaju, _demon funkcija još nije pozvana.

ps -C test -o "pid ppid pgid sid tty statnaredba"
# Izlaz
PID PPID PGID SID TT STAT NAREDBA
10296 5119 10296 5117 bodova/2 S+ ./test

Kada pogledate na STAT polje, vidite da je vaš proces pokrenut, ali čeka da se dogodi događaj izvan rasporeda koji će uzrokovati njegovo pokretanje u prvom planu.

Skraćenica Značenje
S Čekanje u snu da se dogodi događaj
T Aplikacija je zaustavljena
s Voditelj sjednice
+ Aplikacija radi u prvom planu

Možete vidjeti da je roditeljski proces vaše aplikacije ljuska prema očekivanjima.

ps -jp 5119 
# Izlaz
PID PGID SID TTY VRIJEME CMD
5119 5119 5117 bodova/2 00:00:02 zsh

Sada se vratite na terminal na kojem pokrećete svoju aplikaciju i pritisnite Unesi zazvati se _demon funkcija. Zatim ponovno pogledajte informacije o procesu na drugom terminalu.

ps -C test -o "pid ppid pgid sid tty statnaredba"
# Izlaz
PID PPID PGID SID TT STAT NAREDBA
22504 1 22481 5117 bodova/2 S ./test

Prije svega, možete reći da se novi podproces izvodi u pozadini jer ne vidite + lik u STAT polje. Sada ispitajte tko je nadređeni proces procesa pomoću sljedeće naredbe:

ps -jp 1 
​​​​​​​# Izlaz
PID PGID SID TTY VRIJEME CMD
1 1 1? 00:00:01systemd

Sada možete vidjeti da je roditeljski proces vašeg procesa systemd postupak. Gore je spomenuto da se za sljedeći korak treba otvoriti nova sesija i proces treba odspojiti s kontrolnog terminala. Za to koristite funkciju setsid. Dodajte ovaj poziv u svoj _demon funkcija.

Komad koda za dodavanje je sljedeći:

if (setsid() == -1) 
povratak-1;

Sad kad ste prethodno pregledali stanje _demon zove, sada možete ukloniti prvu getchar funkcija u test.c kodirati.

//test.c
#uključiti <stdio.h>
int_demon(int, int);
intglavni()
{
_daemon (0, 0);
getchar();
povratak0;
}

Nakon što sastavite i ponovno pokrenete aplikaciju, idite na terminal na kojem ste napravili svoje recenzije. Novi status vašeg procesa je sljedeći:

ps -C test -o "pid ppid pgid sid tty statnaredba"
​​​​​​​# Izlaz
PID PPID PGID SID TT STAT NAREDBA
25494 1 25494 25494? Ss ./test

The ? upisati se u TT polje označava da vaš proces više nije povezan s terminalom. Primijetite da je PID, PGID, i SID vrijednosti vašeg procesa su iste. Vaš je proces sada voditelj sesije.

U sljedećem koraku promijenite radni direktorij u korijenski direktorij prema vrijednosti argumenta koji ste proslijedili. Možete dodati sljedeći isječak u _demon funkcija za ovo:

if (!nochdir) {
ako (chdir("/") == -1)
povratak-1;
}

Sada, prema proslijeđenom argumentu, svi deskriptori datoteka mogu se zatvoriti. Dodajte sljedeći kod u _demon funkcija:

#define NR_OTVOREN 1024
if (!noclose) {
za (i = 0; i < NR_OTVOREN; i++)
zatvoriti (i);
otvoren("/dev/null", O_RDWR);
dup (0);
dup (0);
}

Nakon što su svi deskriptori datoteka zatvoreni, nove datoteke koje je otvorio demon bit će prikazane s deskriptorima 0, 1 i 2. U ovom slučaju, na primjer, printf naredbe u kodu bit će usmjerene na drugu otvorenu datoteku. Kako bi se to izbjeglo, prva tri identifikatora upućuju na /dev/null uređaj.

U ovom slučaju, konačno stanje _demon funkcija će biti sljedeća:

#uključiti <sys/vrste.h>
#uključiti <sys/stat.h>
#uključiti <stdio.h>
#uključiti <stdlib.h>
#uključiti <fcntl.h>
#uključiti <errno.h>
#uključiti <unistd.h>
#uključiti <syslog.h>
#uključiti <niz.h>
int_demon(poništiti){
// PID: ID procesa
// SID: ID sesije
pid_t pid, sid;
pid = vilica(); // Odvojiti se od roditeljskog procesa
ako (pid < 0) {
Izlaz(IZLAZ_POGREŠKA);
}
ako (pid > 0) {
Izlaz(IZLAZ_USPJEH);
}
// Stvoriti a SIDzadijete
sid = setid();
ako (sid < 0) {
// IZNEVJERITI
Izlaz(IZLAZ_POGREŠKA);
}
ako ((chdir("/")) < 0) {
// IZNEVJERITI
Izlaz(IZLAZ_POGREŠKA);
}
zatvori (STDIN_FILENO);
zatvori (STDOUT_FILENO);
zatvori (STDERR_FILENO);
dok (1) {
// Neki zadaci
spavati (30);
}
Izlaz(IZLAZ_USPJEH);
}

Evo primjera isječka koda koji pokreće sshd primjena kao a demon:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int F D;
if (demon (0, 0) < 0)
fatalan ("daemon() nije uspio: %.200s", strerror (errno));
/* Odspojiti od kontrolnog tty. */
fd = otvoren (_PATH_TTY, O_RDWR | O_NOCTTY);
ako (fd >= 0) {
(poništiti) ioctl (fd, TIOCNOTTY, NULL);
zatvoriti (fd);
}
}
...

Demoni su važni za programiranje sustava Linux

Daemoni su programi koji izvode različite radnje na unaprijed definiran način postavljene kao odgovor na određene događaje. Nečujno rade na vašem Linux računalu. Nisu pod izravnom kontrolom korisnika i svaka usluga koja radi u pozadini ima svog demona.

Važno je ovladati demonima kako biste naučili strukturu kernela operacijskog sustava Linux i razumjeli rad različitih arhitektura sustava.

Što je Daemon?

Pročitajte dalje

UdioCvrkutUdioE-mail

Povezane teme

  • Linux
  • Linux kernel
  • Programiranje
  • C Programiranje

O autoru

Fatih Küçükkarakurt (Objavljeno 5 članaka)

Inženjer i programer koji je ljubitelj matematike i tehnologije. Oduvijek je volio računala, matematiku i fiziku. Razvio je projekte motora za igre, kao i strojno učenje, umjetne neuronske mreže i biblioteke linearne algebre. Štoviše, nastavlja raditi na strojnom učenju i linearnim matricama.

Više od Fatiha Küçükkarakurta

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e-knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu