Dēmoni ir procesi, kas nedarbojas tieši lietotāja kontrolē, bet darbojas fonā. Parasti tie sākas sistēmas startēšanas laikā un darbojas nepārtraukti, līdz sistēma izslēdzas. Vienīgā atšķirība starp šiem un parastajiem procesiem ir tāda, ka tie nekādā veidā nesūta ziņojumus uz konsoli vai ekrānu.

Lūk, kā Linux mašīnā varat izveidot dēmonu.

Īss ievads par to, kā tiek radīti dēmoni

Sistēmā darbojas daudz dēmonu, un daži pazīstami dēmonu piemēri ir šādi:

  • cronds: liek komandām palaist norādītajā laikā
  • sshd: Ļauj pieteikties sistēmā no attālām iekārtām
  • httpd: apkalpo tīmekļa lapas
  • nfsd: ļauj koplietot failus tīklā

Arī dēmonu procesi parasti tiek nosaukti tā, lai tie beidzas ar burtu d, lai gan tas nav obligāti.

Lai process darbotos kā dēmons, tiek izmantots šāds ceļš:

  • Pirms process kļūst par dēmonu, ir jāveic sākotnējās darbības, piemēram, konfigurācijas failu lasīšana vai nepieciešamo sistēmas resursu iegūšana. Tādā veidā sistēma var ziņot lietotājam par saņemtajām kļūdām un process tiks pārtraukts ar atbilstošu kļūdas kodu.
  • instagram viewer
  • Fona darbības process tiek izveidots ar init kā vecāku procesu. Šim nolūkam no sākuma procesa vispirms tiek atdalīts apakšprocess, un pēc tam augšējais process tiek pārtraukts ar izeju.
  • Ir jāatver jauna sesija, izsaucot funkciju setsid, un process ir jāatvieno no termināļa.
  • Visi atvērto failu deskriptori, kas mantoti no vecākprocesa, ir aizvērti.
  • Standarta ieeja, izeja, un kļūdu ziņojumi tiek novirzīti uz /dev/null.
  • Jāmaina procesa darba direktorijs.

Kas ir dēmonu sesijas?

Pēc pieteikšanās sistēmā, izmantojot termināli, lietotāji var palaist daudzas lietojumprogrammas, izmantojot čaulas programmu. Šie procesi ir jāaizver, kad lietotājs iziet no sistēmas. Operētājsistēma šos procesus sagrupē sesiju un procesu grupās.

Katra sesija sastāv no procesu grupām. Šo situāciju varat aprakstīt šādi:

Termināli, kurā procesi saņem ievades un nosūta izejas, sauc par vadības termināli. Kontrolējošais terminālis vienlaikus ir saistīts tikai ar vienu sesiju.

Sesijai un tajā esošajām procesu grupām ir identifikācijas (ID) numuri; šie identifikācijas numuri ir sesijas un procesa grupu vadītāju procesa identifikācijas numuri (PID). Pakārtotajam procesam ir tāda pati grupa kā tā vecākajam procesam. Kad ir vairāki procesi sazinoties ar cauruļu mehānismu, pirmais process kļūst par procesa grupas vadītāju.

Dēmona procesa izveide operētājsistēmā Linux

Šeit jūs redzēsiet, kā varat izveidot dēmona funkciju. Šim nolūkam izveidosit funkciju ar nosaukumu _dēmons. Varat sākt, nosaucot lietojumprogrammas kodu, kas darbosies kā dēmons, kā tests.c, un kods, ar kuru izveidosit dēmona funkciju dēmons.c.

//test.c
#iekļauts <stdio.h>
starpt_dēmons(starpt, starpt);
starptgalvenais()
{
getchar();
_dēmons (0, 0);
getchar();
atgriezties0;
}
//daemon.c
#iekļauts <sys/types.h>
#iekļauts <sys/stat.h>
#iekļauts <stdlib.h>
#iekļauts <stdio.h>
#iekļauts <fcntl.h>
#iekļauts <unistd.h>
#iekļauts <Linux/fs.h>
#iekļauts <Linux/limits.h>
starpt_dēmons(starpt nochdir, starpt noclose){
pid_t pid;
pid = dakša (); // Atvienojiet vecāku procesu
ja (pid < 0) {
Izeja(EXIT_FAILURE);
}
ja (pid > 0) {
Izeja(EXIT_SUCCESS);
}
atgriezties0;
}

Lai izveidotu dēmonu, ir nepieciešams fona process, kura vecākais process ir init. Iepriekš minētajā kodā _dēmons izveido bērnu procesu un pēc tam nogalina vecāku procesu. Šajā gadījumā jūsu jaunais process būs init apakšprocess un turpinās darboties fonā.

Tagad apkopojiet lietojumprogrammu ar šādu komandu un pārbaudiet procesa statusu pirms un pēc _deamon tiek saukts:

gcc-opārbaudepārbaude.cdēmons.c

Palaidiet lietojumprogrammu un pārslēdzieties uz citu termināli, nenospiežot citus taustiņus:

./pārbaude

Var redzēt, ka ar jūsu procesu saistītās vērtības ir šādas. Šeit jums būs jāizmanto ps komandu, lai iegūtu ar procesu saistītu informāciju. Šajā gadījumā, _dēmons funkcija vēl nav izsaukta.

ps -C pārbaude -o "pid ppid pgid sid tty statkomandu"
# Izvade
PID PPID PGID SID TT STAT KOMANDA
10296 5119 10296 5117 pts/2 S+ ./pārbaude

Kad paskatās uz STAT laukā, jūs redzat, ka jūsu process darbojas, bet gaida, kad notiks ārpus grafikas notikums, kas liks tam darboties priekšplānā.

Saīsinājums Nozīme
S Gaida miegā, kad notiks kāds notikums
T Lietojumprogramma apturēta
s Sesijas vadītājs
+ Lietojumprogramma darbojas priekšplānā

Varat redzēt, ka jūsu pieteikuma pamatprocess ir čaula, kā paredzēts.

ps-jp 5119 
# Izvade
PID PGID SID TTY LAIKS CMD
5119 5119 5117 pts/2 00:00:02 zsh

Tagad atgriezieties terminālī, kurā palaižat savu lietojumprogrammu, un nospiediet Ievadiet izsaukt _dēmons funkcija. Pēc tam vēlreiz skatiet procesa informāciju otrā terminālī.

ps -C pārbaude -o "pid ppid pgid sid tty statkomandu"
# Izvade
PID PPID PGID SID TT STAT KOMANDA
22504 1 22481 5117 pts/2 S ./pārbaude

Pirmkārt, varat teikt, ka jaunais apakšprocess darbojas fonā, jo jūs neredzat + raksturs STAT lauks. Tagad pārbaudiet, kurš ir procesa galvenais process, izmantojot šādu komandu:

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

Tagad varat redzēt, ka jūsu procesa pamatprocess ir systemd process. Iepriekš minēts, ka nākamajam solim ir jāatver jauna sesija un process ir jāatvieno no vadības termināļa. Šim nolūkam jūs izmantojat funkciju setsid. Pievienojiet šo zvanu savam _dēmons funkcija.

Koda daļa, kas jāpievieno, ir šāda:

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

Tagad, kad esat pārbaudījis valsti iepriekš _dēmons sauc, tagad varat noņemt pirmo getchar funkcija tests.c kodu.

//test.c
#iekļauts <stdio.h>
starpt_dēmons(starpt, starpt);
starptgalvenais()
{
_dēmons (0, 0);
getchar();
atgriezties0;
}

Pēc lietojumprogrammas kompilēšanas un atkārtotas palaišanas dodieties uz termināli, kurā veicāt atsauksmes. Jūsu procesa jaunais statuss ir šāds:

ps -C pārbaude -o "pid ppid pgid sid tty statkomandu"
​​​​​​​# Izvade
PID PPID PGID SID TT STAT KOMANDA
25494 1 25494 25494? Ss./pārbaude

The ? pierakstieties TT lauks norāda, ka jūsu process vairs nav savienots ar termināli. Ievērojiet, ka PID, PGID, un SID jūsu procesa vērtības ir vienādas. Jūsu process tagad ir sesijas vadītājs.

Nākamajā darbībā mainiet darba direktoriju uz saknes direktoriju atbilstoši nodotā ​​argumenta vērtībai. Varat pievienot šādu fragmentu _dēmons funkcija šim:

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

Tagad, saskaņā ar pieņemto argumentu, visus failu deskriptorus var aizvērt. Pievienojiet tālāk norādīto kodu _dēmons funkcija:

#define NR_OPEN 1024
if (!noclose) {
par (i = 0; i < NR_OPEN; i++)
aizvērt (i);
atvērt ("/dev/nulles", O_RDWR);
dup (0);
dup (0);
}

Kad visi failu deskriptori ir aizvērti, tiks parādīti jauni dēmona atvērtie faili ar attiecīgi deskriptoriem 0, 1 un 2. Šajā gadījumā, piemēram, printf komandas kodā tiks novirzītas uz otro atvērto failu. Lai no tā izvairītos, pirmie trīs identifikatori norāda uz /dev/null ierīci.

Šajā gadījumā galīgais stāvoklis _dēmons funkcija būs šāda:

#iekļauts <sys/types.h>
#iekļauts <sys/stat.h>
#iekļauts <stdio.h>
#iekļauts <stdlib.h>
#iekļauts <fcntl.h>
#iekļauts <errno.h>
#iekļauts <unistd.h>
#iekļauts <syslog.h>
#iekļauts <string.h>
starpt_dēmons(nederīgs){
// PID: procesa ID
// SID: sesijas ID
pid_t pid, sid;
pid = dakša (); // Atvienojiet vecāku procesu
ja (pid < 0) {
Izeja(EXIT_FAILURE);
}
ja (pid > 0) {
Izeja(EXIT_SUCCESS);
}
// Izveidot a SIDpriekšbērns
sid = setsid();
ja (sid < 0) {
// FAIL
Izeja(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// FAIL
Izeja(EXIT_FAILURE);
}
aizvērt (STDIN_FILENO);
aizvērt (STDOUT_FILENO);
aizvērt (STDERR_FILENO);
kamēr (1) {
// Daži uzdevumi
gulēt (30);
}
Izeja(EXIT_SUCCESS);
}

Šeit ir koda fragmenta piemērs, kas palaiž sshd pieteikums kā a dēmons:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
starpt fd;
if (dēmons (0, 0) < 0)
letāls ("dēmons() neizdevās: %.200s", strerror (errno));
/* Atvienojiet no kontrolējošā tty. */
fd = atvērts (_PATH_TTY, O_RDWR | O_NOCTTY);
ja (fd >= 0) {
(nederīgs) ioctl (fd, TIOCNOTTY, NULL);
aizvērt (fd);
}
}
...

Dēmoni ir svarīgi Linux sistēmas programmēšanai

Dēmoni ir programmas, kas veic dažādas darbības iepriekš noteiktā veidā, kas ir iestatītas, reaģējot uz noteiktiem notikumiem. Tie darbojas klusi jūsu Linux mašīnā. Tie nav tiešā lietotāja kontrolē, un katram pakalpojumam, kas darbojas fonā, ir savs dēmons.

Ir svarīgi apgūt dēmonus, lai apgūtu Linux operētājsistēmas kodola struktūru un izprastu dažādu sistēmu arhitektūru darbību.

Kas ir dēmons?

Lasiet Tālāk

DalītiesČivinātDalītiesE-pasts

Saistītās tēmas

  • Linux
  • Linux kodols
  • Programmēšana
  • C Programmēšana

Par autoru

Fatih Küçükkarakurt (Publicēti 5 raksti)

Inženieris un programmatūras izstrādātājs, kurš ir matemātikas un tehnoloģiju cienītājs. Viņam vienmēr ir patikuši datori, matemātika un fizika. Viņš ir izstrādājis spēļu dzinēju projektus, kā arī mašīnmācīšanos, mākslīgos neironu tīklus un lineārās algebras bibliotēkas. Turklāt turpina strādāt pie mašīnmācības un lineārām matricām.

Vairāk no Fatih Küçükkarakurt

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai saņemtu tehniskos padomus, pārskatus, bezmaksas e-grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu