A Linux kernel jelzőmechanizmusa lehetővé teszi, hogy a futó alkalmazások aszinkron módon értesítsék a rendszert, ha új esemény történik. Természetéből adódóan ezt a jelzőmechanizmust általában szoftveres megszakításnak nevezik. Csakúgy, mint a hardveres megszakítások, a jelek megszakítják az alkalmazás normál áramlását, és megjósolhatatlan, hogy az alkalmazás mikor kap jelet.

Merüljünk el mélyen a Linux jelzési mechanizmusában, és értsük meg, mi történik a színfalak mögött.

Alapvető jelfogalmak Linuxban

Linuxon a folyamatok három alapvető helyzetben generálnak jeleket:

  • Amikor kivételes helyzet áll elő a hardver oldalon. Gondolhat például olyan eseményekre, mint például az alkalmazás, amely megpróbál hozzáférni egy régión kívülre megengedett címtér (szegmentációs hiba), vagy olyan gépi kód generálása, amely nullával való osztást tartalmaz művelet.
  • Olyan helyzetek, mint például a billentyűkombinációk használata, mint pl Ctrl + C vagy Ctrl + Z a konzolon a felhasználó által, a konzol képernyőjének átméretezése vagy kill jel küldése.
  • instagram viewer
  • Az alkalmazásban beállított időzítő lejár, magas az alkalmazásnak adott CPU limit, nyitott fájlleíróba jönnek az adatok stb.

A jelek fogalma a Unix korai verziói óta létezik. Korábban több különbség is volt a Unix verziók között a jelfeldolgozást illetően. Később, vele a POSIX szabványosítás A jelkezelésre készült Linux és más Unix származékok ezeket a szabványokat követték. Emiatt a Unix jelek és a POSIX jelek fogalma, amellyel egyes dokumentumokban találkozhat, a különbségekre mutat rá.

Jelszámok

A jelek különböző számértékekkel rendelkeznek, egytől kezdve. Például az 1. jel a HUP jel szinte minden rendszerben, vagy a 9. jel a MEGÖL jel.

Azonban ezeknek a számoknak a használata erősen nem ajánlott, ha jeleket használ az alkalmazásokban. POSIX jelek esetén jel.h fájlnak az alkalmazásban kell lennie, és a fejlesztőnek a kapcsolódó számok állandó definícióit kell használnia, mint pl SÓGOTT, SIGKILLstb. helyette.

Ha megvizsgálja a /usr/include/signal.h fájlt a rendszeren, megtekintheti a további műveleteket és az egyéb mellékelt fájlokat, ha megnézi az értékek definícióit, mint pl __USE_POSIX, __USE_XOPEN, __USE_POSIX199309stb. a fájlban. A Linux rendszereken elérhető jelszámokat a /usr/include/asm-generic/signal.h fájlt, amelyet nem kell közvetlenül az alkalmazás kódjában szerepeltetnie.

Jelgenerálás és -küldés

A jelgenerálás egy esemény miatt következik be. A jel elküldése (szállítása) az érintett alkalmazáshoz azonban nem történik meg a jel generálásával egyidejűleg.

Ahhoz, hogy a jel elküldhető legyen az alkalmazásnak, az alkalmazásnak éppen futnia kell, és rendelkeznie kell CPU-erőforrásokkal. Ezért a jel küldése egy adott alkalmazásnak akkor történik meg, amikor az adott alkalmazás a környezetváltás után újra elkezd dolgozni.

A függőben lévő jel koncepciója

A generálástól a jel továbbításáig tartó idő alatt a jelek készenléti állapotban vannak. A folyamathoz engedélyezett függőben lévő jelek és függőben lévő jelek számát a következőről érheti el /proc/PID/status fájlt.

# PID-vel rendelkező folyamat esetén: 2299
cat /proc/2299/status

# Kimenet
...
SigQ: 2/31630
...

Jelmaszkok és blokkolás

A jelek pontos érkezési idejét az alkalmazás gyakran megjósolhatatlan. Ezért bármely művelet során előfordulhat néhány kritikus megszakítás. Ez komoly problémákat okozhat egy nagyszabású alkalmazásnál.

Az ehhez hasonló nemkívánatos helyzetek elkerülése érdekében jelzőmaszkokat kell használni. Így lehetséges néhány jel blokkolása egy kritikus művelet előtt. Ebben a szakaszban fontos a kritikus rész befejezése és a meghatározott blokkok eltávolítása. Erre a folyamatra az alkalmazásfejlesztőnek figyelnie kell.

Amikor az alkalmazás blokkol egy jelet, a generált többi azonos típusú jel várakozó állapotban lesz a blokkolás feloldásáig. Az alkalmazásban a blokk eltávolítása után a függőben lévő jelek küldése is biztosított.

Ily módon a blokkoláskor tartásba helyezett azonos típusú jelek csak egyszer kerülnek elküldésre az alkalmazásnak a blokk normál használat során történő eltávolítása után. Más a helyzet a valós idejű jelek esetében.

Linux jeltípusok

Az alapértelmezett műveletek a jel típusától függően változhatnak. Ha a megfelelő jelet fogadó alkalmazás nem rendelkezik jelkezelő funkcióval, akkor az alapértelmezett művelet történik. Ez néha az alkalmazás leállítását, néha pedig a jel figyelmen kívül hagyását jelenti.

Egyes jelek nem rögzíthetők az alkalmazási rétegben, ezek a jelek mindig az alapértelmezett műveletet hajtják végre (mint például a KILL jel).

Néhány olyan művelet mellett, amelyek az alkalmazás leállását okozzák, egy alapvető kiíratási fájl is készül. A kapcsolódó folyamat virtuális memória táblájának lemezre írásával létrejött alapvető dump fájlok segítik a A felhasználónak meg kell vizsgálnia az állapotinformációkat, mielőtt a folyamat véget érne a következő szakaszokban található hibakereső eszközökkel.

A következő értékek an példaértékű MIPS architektúra:

Jel Szám Alapértelmezett művelet Elkapható?
SÓGOTT 1 Az alkalmazás megszüntetése Igen
SIGINT 2 Az alkalmazás megszüntetése Igen
SIGQUIT 3 Alkalmazás leállítása (mag kiíratása) Igen
SIGILL 4 Alkalmazás leállítása (mag kiíratása) Igen
SIGTRAP 5 Alkalmazás leállítása (mag kiíratása) Igen
SIGABRT 6 Alkalmazás leállítása (mag kiíratása) Igen
SIGFPE 8 Alkalmazás leállítása (mag kiíratása) Igen
SIGKILL 9 Az alkalmazás megszüntetése Nem
SIGBUS 10 Alkalmazás leállítása (mag kiíratása) Igen
SIGSEGV 11 Alkalmazás leállítása (mag kiíratása) Igen
SIGSYS 12 Alkalmazás leállítása (mag kiíratása) Igen
SIGPIPE 13 Az alkalmazás megszüntetése Igen
SIGALRM 14 Az alkalmazás megszüntetése Igen
SIGTERM 15 Az alkalmazás megszüntetése Igen
SIGUSR1 16 Az alkalmazás megszüntetése Igen
SIGUSR2 17 Az alkalmazás megszüntetése Igen
SIGCHLD 18 Figyelmen kívül hagyni Igen
SIGTSTP 20 Állj meg Igen
SIGURG 21 Figyelmen kívül hagyni Igen
SIGPOLL 22 Az alkalmazás megszüntetése Igen
SIGSTOP 23 Állj meg Nem
SIGCONT 25 Ha leállt, folytassa Igen
SIGTTIN 26 Állj meg Igen
SIGTTOU 27 Állj meg Igen
SIGVTALRM 28 Az alkalmazás megszüntetése Igen
SIGPROF 29 Az alkalmazás megszüntetése Igen
SIGXCPU 30 Alkalmazás leállítása (mag kiíratása) Igen
SIGXFSZ 31 Alkalmazás leállítása (mag kiíratása) Igen

A jelek életciklusa Linuxban

A jelek három szakaszon mennek keresztül. Ezeket elsősorban a gyártási fázisban állítják elő, a kernel vagy bármilyen eljárás segítségével, és számmal jelölik őket. Könnyedén és gyorsan dolgoznak, mivel nincs rájuk többletterhelés. De ha megnézi a POSIX oldalt, látni fogja, hogy a valós idejű jelek extra adatokat továbbíthatnak.

A jelek szállítási fázisa a gyártási fázis után következik. Általában a jelek a lehető leggyorsabban elérik az alkalmazást a kerneltől. Néha azonban az alkalmazások blokkolhatják a jeleket kritikus műveletek végrehajtása közben. Ilyen esetekben a jelzés függőben marad, amíg a tranzakció meg nem történik.

A jelekhez hasonlóan a folyamatok is szerves részét képezik a Linux ökoszisztémának. A folyamatok és működésük megértése kulcsfontosságú, ha azt tervezi, hogy Linux rendszergazda lesz.

Mi az a folyamat a Linuxban?

Olvassa el a következőt

RészvényCsipogRészvényEmail

Kapcsolódó témák

  • Linux
  • Linux Kernel
  • Rendszer adminisztráció

A szerzőről

Fatih Küçükkarakurt (9 cikk megjelent)

Mérnök és szoftverfejlesztő, aki a matematika és a technológia rajongója. Mindig is szerette a számítógépeket, a matematikát és a fizikát. Játékmotor-projekteket, valamint gépi tanulást, mesterséges neurális hálózatokat és lineáris algebra-könyvtárakat fejlesztett ki. Továbbá továbbra is dolgozik a gépi tanuláson és a lineáris mátrixokon.

Továbbiak Fatih Küçükkarakurttól

Iratkozzon fel hírlevelünkre

Csatlakozzon hírlevelünkhöz műszaki tippekért, ismertetőkért, ingyenes e-könyvekért és exkluzív ajánlatokért!

Kattintson ide az előfizetéshez