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.
- 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
Kapcsolódó témák
- Linux
- Linux Kernel
- Rendszer adminisztráció
A szerzőről
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.
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