Demonai yra procesai, kurie nevykdo tiesiogiai vartotojo kontroliuojami, bet veikia fone. Paprastai jie paleidžiami paleidžiant sistemą ir veikia nuolat, kol sistema išsijungia. Vienintelis skirtumas tarp šių ir įprastų procesų yra tas, kad jie jokiu būdu nesiunčia pranešimų į konsolę ar ekraną.

Štai kaip galite sukurti demoną Linux kompiuteryje.

Trumpas demonų kūrimo įvadas

Sistemoje veikia daug demonų, o kai kurie žinomi demonų pavyzdžiai yra tokie:

  • crond: leidžia paleisti komandas nurodytu laiku
  • sshd: Leidžia prisijungti prie sistemos iš nuotolinių mašinų
  • httpd: Aptarnauja tinklalapius
  • nfsd: Leidžia dalytis failais tinkle

Be to, demonų procesai paprastai pavadinami taip, kad baigtųsi raide d, nors tai nėra privaloma.

Kad procesas vyktų kaip demonas, sekamas toks kelias:

  • Pradinės operacijos, tokios kaip konfigūracijos failų skaitymas arba būtinų sistemos išteklių gavimas, turi būti atliekamos prieš procesui tampant demonu. Tokiu būdu sistema gali pranešti apie gautas klaidas vartotojui ir procesas bus baigtas atitinkamu klaidos kodu.
  • instagram viewer
  • Fone veikiantis procesas sukuriamas su init kaip pirminiu procesu. Šiuo tikslu iš pradinio proceso pirmiausia atjungiamas subprocesas, o tada viršutinis procesas baigiamas išėjus.
  • Nauja sesija turėtų būti atidaryta iškvietus funkciją setsid, o procesas turi būti atjungtas nuo terminalo.
  • Visi atidarytų failų aprašai, paveldėti iš pirminio proceso, yra uždaryti.
  • Standartinis įėjimas, išėjimas, o klaidų pranešimai nukreipiami į /dev/null.
  • Proceso darbo katalogas turi pasikeisti.

Kas yra demonų seansai?

Prisijungę prie sistemos per terminalą, vartotojai gali paleisti daugybę programų per apvalkalo programą. Šie procesai turėtų užsidaryti, kai vartotojas išeina iš sistemos. Operacinė sistema sugrupuoja šiuos procesus į seansų ir procesų grupes.

Kiekviena sesija susideda iš procesų grupių. Šią situaciją galite apibūdinti taip:

Terminalas, kuriame procesai priima įvestis ir siunčia išėjimus, vadinamas valdymo terminalu. Valdymo terminalas vienu metu yra susietas tik su viena sesija.

Sesija ir joje esančios procesų grupės turi identifikavimo (ID) numerius; šie identifikavimo numeriai yra sesijos ir proceso grupių vadovų proceso identifikavimo numeriai (PID). Antrinis procesas turi tą pačią grupę kaip ir pirminis procesas. Kai vyksta keli procesai susisiekimas su vamzdžio mechanizmu, pirmasis procesas tampa proceso grupės vadovu.

Demono proceso kūrimas „Linux“.

Čia pamatysite, kaip galite sukurti demono funkciją. Šiuo tikslu sukursite funkciją pavadinimu _demonas. Galite pradėti pavadindami programos kodą, kuris veiks kaip demonas bandymas.c, ir kodas, kuriuo sukursite demono funkciją demonas.c.

//test.c
#įtraukti <stdio.h>
tarpt_demonas(tarpt, tarpt);
tarptpagrindinis()
{
getchar ();
_daemon (0, 0);
getchar ();
grąžinti0;
}
//daemon.c
#įtraukti <sys/types.h>
#įtraukti <sys/stat.h>
#įtraukti <stdlib.h>
#įtraukti <stdio.h>
#įtraukti <fcntl.h>
#įtraukti <unistd.h>
#įtraukti <linux/fs.h>
#įtraukti <Linux/limits.h>
tarpt_demonas(tarpt nochdir, tarpt noclose){
pid_t pid;
pid = šakutė (); // Atjunkite tėvų procesą
jei (pid < 0) {
išeiti(EXIT_FAILURE);
}
jei (pid > 0) {
išeiti(EXIT_SCESS);
}
grąžinti0;
}

Norėdami sukurti demoną, jums reikia fono proceso, kurio pirminis procesas yra init. Aukščiau esančiame kode _demonas sukuria antrinį procesą, o paskui užmuša pirminį procesą. Tokiu atveju naujasis procesas bus inicijavimo poprocesas ir toliau veiks fone.

Dabar surinkite programą naudodami šią komandą ir patikrinkite proceso būseną prieš ir po jo _deamon vadinamas:

gcc-obandymasbandymas.cdemonas.c

Paleiskite programą ir perjunkite į kitą terminalą nespausdami jokių kitų klavišų:

./bandymas

Matote, kad su jūsų procesu susijusios reikšmės yra tokios. Čia jūs turėsite naudoti ps komandą, kad gautumėte su procesu susijusią informaciją. Šiuo atveju, _demonas funkcija dar nebuvo iškviesta.

ps -C bandymas -o "pid ppid pgid sid tty statkomandą"
# Išvestis
PID PPID PGID SID TT STAT KOMANDA
10296 5119 10296 5117 tšk./2 S+ ./bandymas

Kai žiūrite į STAT matote, kad jūsų procesas vykdomas, bet laukiama, kol įvyks ne pagal tvarkaraštį įvykęs įvykis, dėl kurio jis bus paleistas pirmame plane.

Santrumpa Reikšmė
S Miego laukimas, kol įvyks įvykis
T Programa sustabdyta
s Sesijos vadovas
+ Programa veikia pirmame plane

Matote, kad pagrindinis jūsų programos procesas yra apvalkalas, kaip ir tikėtasi.

ps -jp 5119 
# Išvestis
PID PGID SID TTY LAIKAS CMD
5119 5119 5117 tšk./2 00:00:02 zsh

Dabar grįžkite į terminalą, kuriame naudojate programą, ir paspauskite Įeikite iškviesti _demonas funkcija. Tada dar kartą peržiūrėkite proceso informaciją kitame terminale.

ps -C bandymas -o "pid ppid pgid sid tty statkomandą"
# Išvestis
PID PPID PGID SID TT STAT KOMANDA
22504 1 22481 5117 tšk./2 S ./bandymas

Visų pirma, galite pasakyti, kad naujas subprocesas veikia fone, nes nematote + personažas STAT lauke. Dabar patikrinkite, kas yra pagrindinis proceso procesas, naudodami šią komandą:

ps -jp 1 
​​​​​​​# Išvestis
PID PGID SID TTY LAIKAS CMD
1 1 1? 00:00:01sisteminis

Dabar galite matyti, kad pagrindinis jūsų proceso procesas yra sisteminis procesas. Aukščiau paminėta, kad kitam žingsniui turėtų būti atidaryta nauja sesija ir procesas turi būti atjungtas nuo valdymo terminalo. Tam naudokite funkciją setsid. Pridėkite šį skambutį prie savo _demonas funkcija.

Kodo dalis, kurią reikia pridėti, yra tokia:

if (setsid() == -1) 
grąžinti-1;

Dabar, kai anksčiau tikrinote valstybę _demonas paskambino, dabar galite pašalinti pirmąjį getchar funkcija bandymas.c kodas.

//test.c
#įtraukti <stdio.h>
tarpt_demonas(tarpt, tarpt);
tarptpagrindinis()
{
_daemon (0, 0);
getchar ();
grąžinti0;
}

Sukūrę ir vėl paleidę programą, eikite į terminalą, kuriame atlikote apžvalgas. Nauja jūsų proceso būsena yra tokia:

ps -C bandymas -o "pid ppid pgid sid tty statkomandą"
​​​​​​​# Išvestis
PID PPID PGID SID TT STAT KOMANDA
25494 1 25494 25494? Ss./bandymas

The ? prisijungti prie TT laukas rodo, kad jūsų procesas nebėra prijungtas prie terminalo. Atkreipkite dėmesį, kad PID, PGID, ir SID jūsų proceso vertės yra tokios pačios. Jūsų procesas dabar yra sesijos vadovas.

Kitame veiksme pakeiskite darbinį katalogą į šakninį katalogą pagal pateikto argumento reikšmę. Galite pridėti šį fragmentą prie _demonas šiai funkcijai:

if (!nochdir) {
if (chdir("/") == -1)
grąžinti-1;
}

Dabar, remiantis priimtu argumentu, visi failų aprašai gali būti uždaryti. Pridėkite šį kodą prie _demonas funkcija:

#define NR_OPEN 1024
if (!noclose) {
už (i = 0; i < NR_OPEN; aš++)
uždaryti (i);
atviras("/dev/nulinis", O_RDWR);
dup (0);
dup (0);
}

Uždarius visus failų aprašus, nauji demono atidaryti failai bus rodomi atitinkamai su deskriptoriais 0, 1 ir 2. Šiuo atveju, pavyzdžiui, printf kode esančios komandos bus nukreiptos į antrą atidarytą failą. Norėdami to išvengti, pirmieji trys identifikatoriai nurodo į /dev/null prietaisas.

Šiuo atveju galutinė būsena _demonas funkcija bus tokia:

#įtraukti <sys/types.h>
#įtraukti <sys/stat.h>
#įtraukti <stdio.h>
#įtraukti <stdlib.h>
#įtraukti <fcntl.h>
#įtraukti <errno.h>
#įtraukti <unistd.h>
#įtraukti <syslog.h>
#įtraukti <eilutė.h>
tarpt_demonas(tuštuma){
// PID: proceso ID
// SID: seanso ID
pid_t pid, sid;
pid = šakutė (); // Atjunkite tėvų procesą
jei (pid < 0) {
išeiti(EXIT_FAILURE);
}
jei (pid > 0) {
išeiti(EXIT_SCESS);
}
// Sukurti a SIDdėlvaikas
sid = setsid();
jei (sid < 0) {
// FIL
išeiti(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// FIL
išeiti(EXIT_FAILURE);
}
uždaryti (STDIN_FILENO);
uždaryti (STDOUT_FILENO);
uždaryti (STDERR_FILENO);
kol (1) {
// Kai kurios užduotys
miegas (30);
}
išeiti(EXIT_SCESS);
}

Pateikiame kodo fragmento, kuris paleidžia sshd taikymas kaip a demonas:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
tarpt fd;
if (demonas (0, 0) < 0)
mirtinas("demonas() nepavyko: %.200s", strerror (errno));
/* Atjunkite nuo valdančiojo tty. */
fd = atvira (_PATH_TTY, O_RDWR | O_NOCTTY);
jei (fd >= 0) {
(tuštuma) ioctl (fd, TIOCNOTTY, NULL);
uždaryti (fd);
}
}
...

Demonai yra svarbūs Linux sistemos programavimui

Demonai yra programos, kurios atlieka įvairius veiksmus iš anksto nustatytu būdu, reaguodamos į tam tikrus įvykius. Jie tyliai veikia jūsų Linux kompiuteryje. Jie nėra tiesiogiai pavaldūs vartotojui ir kiekviena paslauga, veikianti fone, turi savo demoną.

Norint išmokti Linux operacinės sistemos branduolio struktūrą ir suprasti įvairių sistemų architektūrų veikimą, svarbu įvaldyti demonus.

Kas yra demonas?

Skaitykite toliau

DalintisTviteryjeDalintisEl. paštas

Susijusios temos

  • Linux
  • Linux branduolys
  • Programavimas
  • C programavimas

Apie autorių

Fatihas Küçükkarakurtas (5 straipsniai paskelbti)

Inžinierius ir programinės įrangos kūrėjas, kuris yra matematikos ir technologijų gerbėjas. Jam visada patiko kompiuteriai, matematika ir fizika. Jis sukūrė žaidimų variklių projektus, taip pat mašininį mokymąsi, dirbtinius neuroninius tinklus ir tiesinės algebros bibliotekas. Be to, toliau dirba su mašininiu mokymusi ir tiesinėmis matricomis.

Daugiau iš Fatih Küçükkarakurt

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. knygų ir išskirtinių pasiūlymų!

Spauskite čia norėdami užsiprenumeruoti