Deemonid on protsessid, mis ei tööta otse kasutaja kontrolli all, vaid toimivad taustal. Tavaliselt käivituvad need süsteemi käivitamisel ja töötavad pidevalt, kuni süsteem välja lülitub. Ainus erinevus nende ja tavaliste protsesside vahel on see, et need ei saada mingil moel sõnumeid konsooli ega ekraanile.

Siin on, kuidas saate Linuxi masinas deemoni luua.

Lühike sissejuhatus deemonite loomisele

Süsteemis töötab palju deemoneid ja mõned tuttavad deemonite näited on järgmised:

  • crond: paneb käsud määratud ajal käima
  • sshd: Võimaldab süsteemi sisse logida kaugmasinatest
  • httpd: teenindab veebilehti
  • nfsd: võimaldab failide jagamist võrgu kaudu

Samuti nimetatakse deemoniprotsesse tavaliselt tähega lõppevaks d, kuigi see pole kohustuslik.

Protsessi deemonina käitamiseks järgitakse järgmist teed:

  • Esialgsed toimingud, nagu konfiguratsioonifailide lugemine või vajalike süsteemiressursside hankimine, tuleb teha enne, kui protsessist saab deemon. Nii saab süsteem saabunud vigadest kasutajat teavitada ja protsess lõpetatakse vastava veakoodiga.
  • instagram viewer
  • Taustal töötav protsess luuakse, mille ülemprotsess on init. Selleks eraldatakse algprotsessist esmalt alamprotsess ja seejärel lõpetatakse ülemine protsess väljumisega.
  • Uus seanss peaks avanema, kutsudes funktsiooni setsid, ja protsess tuleb terminalist lahti ühendada.
  • Kõik emaprotsessist päritud avatud failideskriptorid on suletud.
  • Standardsisend, väljundja veateated suunatakse aadressile /dev/null.
  • Protsessi töökataloog peab muutuma.

Mis on deemoni seansid?

Pärast terminali kaudu süsteemi sisselogimist saavad kasutajad shell-programmi kaudu käivitada paljusid rakendusi. Need protsessid peaksid sulguma, kui kasutaja süsteemist väljub. Operatsioonisüsteem rühmitab need protsessid seansi- ja protsessirühmadesse.

Iga seanss koosneb protsessirühmadest. Saate seda olukorda kirjeldada järgmiselt.

Terminali, kus protsessid võtavad vastu oma sisendid ja saadavad väljundid, nimetatakse juhtterminaliks. Juhtterminal on korraga seotud ainult ühe seansiga.

Seansil ja selles olevatel protsessirühmadel on identifitseerimisnumbrid (ID); need identifitseerimisnumbrid on seansi ja protsessirühma juhtide protsessi identifitseerimisnumbrid (PID). Alamprotsess jagab sama rühma kui tema ülemprotsess. Kui on mitu protsessi suhtlemine torumehhanismiga, saab esimesest protsessist protsessirühma juht.

Deemoni protsessi loomine Linuxis

Siin näete, kuidas saate deemoni funktsiooni luua. Selleks loote funktsiooni nimega _deemon. Alustuseks võite nimetada deemonina töötava rakenduse koodi nimeks test.cja kood, millena deemonifunktsiooni loote deemon.c.

//test.c
#kaasa <stdio.h>
int_deemon(int, int);
intpeamine()
{
getchar();
_deemon (0, 0);
getchar();
tagasi0;
}
//daemon.c
#kaasa <sys/types.h>
#kaasa <sys/stat.h>
#kaasa <stdlib.h>
#kaasa <stdio.h>
#kaasa <fcntl.h>
#kaasa <unistd.h>
#kaasa <linux/fs.h>
#kaasa <linux/limits.h>
int_deemon(int nochdir, int noclose){
pid_t pid;
pid = kahvel(); // Katkesta vanemprotsess
kui (pid < 0) {
väljuda(EXIT_FAILURE);
}
kui (pid > 0) {
väljuda(EXIT_SUCCESS);
}
tagasi0;
}

Deemoni loomiseks vajate taustprotsessi, mille vanemprotsess on init. Ülaltoodud koodis _deemon loob alamprotsessi ja seejärel tapab vanemprotsessi. Sel juhul on teie uus protsess initi alamprotsess ja jätkab töötamist taustal.

Nüüd koostage rakendus järgmise käsuga ja uurige protsessi olekut enne ja pärast _deamon kutsutakse:

gcc-okatsetadakatsetada.cdeemon.c

Käivitage rakendus ja lülituge teisele terminalile ilma muid klahve vajutamata:

./katsetada

Näete, et teie protsessiga seotud väärtused on järgmised. Siin peate kasutama protsessiga seotud teabe hankimiseks käsk ps. Sel juhul on _deemon funktsiooni pole veel välja kutsutud.

ps -C katsetada -o "pid ppid pgid sid tty statkäsk"
# Väljund
PID PPID PGID SID TT STAT KÄSK
10296 5119 10296 5117 pts/2 S+ ./katsetada

Kui vaatate STAT väljal näete, et teie protsess töötab, kuid ootab ajakavavälise sündmuse toimumist, mille tõttu see töötab esiplaanil.

Lühend Tähendus
S Ootab magama, millal sündmus juhtub
T Rakendus peatati
s Seansi juht
+ Rakendus töötab esiplaanil

Näete, et teie rakenduse põhiprotsess on ootuspäraselt kest.

ps - jp 5119 
# Väljund
PID PGID SID TTY AEG CMD
5119 5119 5117 pts/2 00:00:02 zsh

Nüüd pöörduge tagasi terminali, kus oma rakendust kasutate, ja vajutage nuppu Sisenema kutsuda esile _deemon funktsiooni. Seejärel vaadake uuesti protsessiteavet teises terminalis.

ps -C katsetada -o "pid ppid pgid sid tty statkäsk"
# Väljund
PID PPID PGID SID TT STAT KÄSK
22504 1 22481 5117 pts/2 S ./katsetada

Esiteks võite öelda, et uus alamprotsess töötab taustal, kuna te ei näe + tegelane STAT valdkonnas. Nüüd uurige järgmise käsu abil, kes on protsessi vanemprotsess:

ps - jp 1 
​​​​​​​# Väljund
PID PGID SID TTY AEG CMD
1 1 1? 00:00:01süsteemne

Nüüd näete, et teie protsessi põhiprotsess on süsteemne protsessi. Eespool on mainitud, et järgmise sammu jaoks peaks avanema uus seanss ja protsess tuleks juhtterminali küljest lahti ühendada. Selleks kasutate funktsiooni setsid. Lisage see kõne oma _deemon funktsiooni.

Lisatav kooditükk on järgmine:

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

Nüüd, kui olete osariiki varem kontrollinud _deemon kutsus, saate nüüd esimese eemaldada getchar funktsioonis test.c kood.

//test.c
#kaasa <stdio.h>
int_deemon(int, int);
intpeamine()
{
_deemon (0, 0);
getchar();
tagasi0;
}

Pärast rakenduse koostamist ja uuesti käivitamist minge terminali, kus arvustused tegite. Teie protsessi uus olek on järgmine:

ps -C katsetada -o "pid ppid pgid sid tty statkäsk"
​​​​​​​# Väljund
PID PPID PGID SID TT STAT KÄSK
25494 1 25494 25494? Ss ./katsetada

The ? logige sisse TT väli näitab, et teie protsess pole enam terminaliga ühendatud. Pange tähele, et PID, PGID, ja SID teie protsessi väärtused on samad. Teie protsess on nüüd seansi juht.

Järgmises etapis muutke töökataloog juurkataloogiks vastavalt edastatud argumendi väärtusele. Saate lisada järgmise lõigu _deemon funktsioon selleks:

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

Nüüd saab läbitud argumendi kohaselt kõik failideskriptorid sulgeda. Lisage sellele järgmine kood _deemon funktsioon:

#define NR_OPEN 1024
if (!noclose) {
jaoks (i = 0; i < NR_OPEN; i++)
sulge (i);
avatud ("/dev/null", O_RDWR);
dup (0);
dup (0);
}

Pärast kõigi failideskriptorite sulgemist kuvatakse uued deemoni poolt avatud failid vastavalt deskriptoritega 0, 1 ja 2. Sel juhul näiteks printf koodis olevad käsud suunatakse teise avatud faili. Selle vältimiseks osutavad kolm esimest identifikaatorit /dev/null seade.

Sel juhul lõppseisund _deemon funktsioon on järgmine:

#kaasa <sys/types.h>
#kaasa <sys/stat.h>
#kaasa <stdio.h>
#kaasa <stdlib.h>
#kaasa <fcntl.h>
#kaasa <errno.h>
#kaasa <unistd.h>
#kaasa <syslog.h>
#kaasa <string.h>
int_deemon(tühine){
// PID: protsessi ID
// SID: Seansi ID
pid_t pid, sid;
pid = kahvel(); // Katkesta vanemprotsess
kui (pid < 0) {
väljuda(EXIT_FAILURE);
}
kui (pid > 0) {
väljuda(EXIT_SUCCESS);
}
// Loo a SIDjaokslaps
sid = setsid();
kui (sid < 0) {
// FAIL
väljuda(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
// FAIL
väljuda(EXIT_FAILURE);
}
sulge (STDIN_FILENO);
sulge (STDOUT_FILENO);
sulge (STDERR_FILENO);
samas (1) {
// Mõned ülesanded
uni (30);
}
väljuda(EXIT_SUCCESS);
}

Siin on näide koodilõigust, mis käivitab sshd rakendus kui a deemon:

...
if (!(debug_flag || inetd_flag || no_daemon_flag)) {
int fd;
if (deemon (0, 0) < 0)
Tappev("deemon() ebaõnnestus: %.200s", strerror (errno));
/* Katkestage ühendus kontrolliva tty-ga. */
fd = avatud (_PATH_TTY, O_RDWR | O_NOCTTY);
if (fd >= 0) {
(tühine) ioctl (fd, TIOCNOTTY, NULL);
sulgema (fd);
}
}
...

Deemonid on Linuxi süsteemiprogrammeerimise jaoks olulised

Deemonid on programmid, mis sooritavad erinevaid toiminguid eelnevalt määratletud viisil, mis on seatud vastuseks teatud sündmustele. Need töötavad vaikselt teie Linuxi masinas. Need ei ole kasutaja otsese kontrolli all ja igal taustal töötaval teenusel on oma deemon.

Deemonite valdamine on oluline, et õppida tundma Linuxi operatsioonisüsteemi tuumastruktuuri ja mõista erinevate süsteemiarhitektuuride toimimist.

Mis on deemon?

Loe edasi

JagaSäutsJagaMeil

Seotud teemad

  • Linux
  • Linuxi kernel
  • Programmeerimine
  • C Programmeerimine

Autori kohta

Fatih Küçükkarakurt (5 artiklit avaldatud)

Insener ja tarkvaraarendaja, kes on matemaatika ja tehnoloogia fänn. Talle on alati meeldinud arvutid, matemaatika ja füüsika. Ta on arendanud nii mängumootorite projekte kui ka masinõpet, tehisnärvivõrke ja lineaaralgebra teeke. Lisaks jätkab ta tööd masinõppe ja lineaarsete maatriksitega.

Veel Fatih Küçükkarakurtilt

Liituge meie uudiskirjaga

Liituge meie uudiskirjaga tehniliste näpunäidete, arvustuste, tasuta e-raamatute ja eksklusiivsete pakkumiste saamiseks!

Tellimiseks klõpsake siin