Bízza jelek 1 részt linux

A modern operációs rendszerek, van fogalma az IPC (Inter-Process Communication - IPC) - egy sor módszerek közötti adatcsere folyamatok és / vagy szálak. Ennek egyik módja jelek csere. A koncepció a jelek által támogatott legtöbb operációs rendszer, hanem például a Windows nem teljes támogatását eszközként használhassák IPC - az ezen operációs rendszerek, a jelek egyelőre csak a standard könyvtár a C

jel fogalma

A jelek egy véletlenszerűen kiválasztott idő (aszinkron), hogy szakítsa meg a folyamatot kezelni egy eseményt. A folyamat megszakítható egy jel által kezdeményezett másik folyamat vagy magot. A rendszermag jelzések használatával értesítik folyamatainak különböző események, mint például a befejezése a gyermek folyamat.

A jelek egy bizonyos életciklusa. Kezdetben egy jel keletkezik - a folyamat küldött vagy azok által a kernel. A jel ezután várja szállítás a vevő folyamat. Úgy véljük, hogy a várakozási idő közötti időintervallumot létre a jel jel, és cselekvési hogy küldi a jelet. Végén az életciklus egy jel a lehallgatott (vétel) folyamat és a teljesítő kapcsolatos tevékenységekre a jelet.

Egyszerű és megbízható jelek jelek

Van egy részlege a jelet egyszerű és megbízható.

Ezeket eredetileg a fejlett és használt egyszerű (megbízhatatlan) jeleket. Szerint a működési elve hasonló a kanonikus mechanizmus kezelő hardver megszakítja a processzor. Ha a folyamat akarta, hogy különleges módon kezelni a jel, azt mondja a kernel róla, rámutatva egy különleges funkció - a jelet kezelő. Amikor nyilvánított egy jel folyamat a kernel a lehető leghamarabb okai jelfeldolgozó processzor, félbeszakítva a munkafolyamat. Befejezése után felvezető végrehajtási folyamat folytatódik az a pont, ahol az félbeszakadt.

Ahelyett, hogy írásban a függvényt, akkor egyszerűen elmondani a kernel, hogy a jel hatására a cselekvés, az alapértelmezett, vagy hogy a jelzés figyelmen kívül hagyja banális.

Ez az egész koncepció a dolgozó jelek jól néz ki elég, amíg a jel érkezik a folyamat, amikor ő már elfoglalva másik jel. Itt és nyilvánvaló problémák - ismét okozta jelzéskezelõ elronthatják azokat a megosztott erőforrások (megosztott adatstruktúrák és változók) használ. Továbbá abban az esetben csatlakoznak a nagyszámú folyamat jelek köteg nélkül növekszik kötött, ami hibás működést okozhat a program.

A folyamat során a probléma megoldásának fejlesztettek megbízható jelek szabványosították POSIX és még ma is használják. Később a cikkben azt tartják megbízhatónak jeleket.

Jelek és a rendszer kéri

A jel lehet jönni a folyamat, amikor a folyamat belsejében egy rendszer hívás például arra számít, hogy az adatbeviteli read (). Ebben az esetben a fejlődés mehet a következő elérési utat: az alkalmazás nem próbálja meg elfogni a jel megszakad, és a mag (pl SIGTERM jel érkezése) - ha a terminál egy nem szabványos konfiguráció, amelyek akadályozhatják a felhasználói élményt. Természetesen lehetőség van, hogy elfogják a jel egyértelmű terminál a jel felvezető, majd kimegy, de ez elég nehéz írni egy jelet kezelő, aki tudta, mit csinál idején megszakad a program eldönti, hogy végezze el a terminál tiszta-e vagy sem.

A mai napig van egy megvalósítása jelek mentes ezeket a hátrányokat. A megoldás az, hogy a kimeneti jel csak beállítani a zászló azt jelzi, hogy a jelet, majd biztosítani kell a visszatérés a rendszer hívás hibakóddal jelzi a megszakítása a hívójelet. Ezután a program kell ellenőrizni jelük jelzéskezelõ, és megteszi a szükséges intézkedéseket, például, hogy törölje a terminál és a kijárat felé.

Modern jel hatására a lassú végrehajtása rendszer kéri, hogy visszatérjen egy hibakódot Eintr, amikor megszakítja a bejövő jel. Gyors rendszer kéri meg kell szüntetni, mielőtt a jelet fogják szállítani. Lassú rendszer hívás - rendszer hívás, amely előírja, hogy meghatározatlan ideig annak befejezését, mint például a read (), várjon (), write (). A rendszer minden hívás függ kiszámíthatatlan források, mint például egy személy akciók, hálózati adatok, stb Ezek lassú. Természetesen az összes többi rendszer kéri - gyors.

Jellemzően a program feldolgozza a Eintr hibakódot, és ha nincs ott semmi végzetes, újraindítja a rendszert hívást. A legtöbb Unix-szerű operációs rendszereket jelenleg ezt alapértelmezés szerint - csak meg kell, hogy feldolgozza a jelet kezelő, és a rendszer hívást automatikusan újraindul. Az alapértelmezett Linux rendszer hívást nem indul újra, de minden jel eljárás beállíthat egy zászló jelzi, hogy a rendszer újraindításához lassú rendszer kéri megszakítva ezt a jelet.

jeleket

Küldött jeleket egyetlen folyamat másik rendszerint végezzük a kill () rendszerhívás. Az első paraméter - PID folyamat, amelyben egy jelet küldött; A második paraméter - a jel számát. Ha azt akarjuk, hogy küldjön egy SIGTERM jelet a folyamat PID 6666, akkor használja a rendszer hívás kill () az alábbiak szerint:

Ahelyett, hogy a pozitív PID értékei átvihetők hívás azonos nagyságrendű, de negatív. Ezután a jelet fog küldeni az összes folyamat a csoport száma egyenlő a modul továbbítja pid. Ha a PID értéke 0, a jelet küldenek az összes folyamat a csoportot, amelyhez érvényes a jelenlegi folyamat. Ezek a lehetőségek elsősorban héjak a feladatuk.

Ha a PID át a rendszer hívás kill () -1, akkor a jelet küldött valamennyi folyamatot kivéve init. Ez a lehetőség használható a rendszer leállítása.

További részletes információkat a rendszer hívás kill (), lásd a két férfi ölni.

Küldj egy jelet folyamat maga is használja a rendszer hívás emelés (), amely elfogadja egy paraméter - a jel számát. például:

Természetesen mindegyik tekinthető rendszer hívás visszatér nullára siker és nulla, ha volt valami hiba.

lehallgatás jelek

Minden program alárendelt POSIX szabvány regisztrálni rakodók jeleket a rendszer használata hívás sigaction (). Ez a rendszer hívás három paramétert: az első - int signum - számos elfogott jelet. Második - struct sigaction * jogszabály - a mutató egy szerkezet, amely leírja a felvezető telepítési szabályokat. A harmadik lehetőség - struct sigaction * oact - már elfogadja a szabályokat a jel kezelő. Vagy a második vagy a harmadik (de nem mind!), A paraméter lehet NULL, ha szükséges.

struct sigaction struktúra a következő leírás:

sa_handler - mutató jel kezelő, a felvezető kell bejelenteni az alábbiak szerint:

ahol egyetlen paraméter - a szignál száma volt a felvezető. sa_handler is egyenlő SIG_IGN - folyamat jelet figyelmen kívül hagyja, és SIG_DFL - jel hatására az alapértelmezett művelet, például megszakítás folyamatot.

sa_mask - egy sor jelzi, hogy blokkolni kell egy hívást ugyanilyen szerkezet a jelfeldolgozó. Hogyan kell telepíteni őket, a későbbiekben tovább.

sa_flags paraméterrel folyamat, hogy módosítsa a viselkedését a jelet. A paraméter lehet hogy csak négy érték, amely azonban, kombinálható a „VAGY” bit művelet:

  1. SA_NOCLDSTOP - Levél SIGCHLD jel csak abban az esetben a gyermek folyamat megszakítása. Felfüggesztése gyermek folyamat nem küld jelet.
  2. SA_NODEFER - emulációs egyszerű (megbízhatatlan) jelzés.
  3. SA_RESTHAND - érkezése után a jel a visszaállítás felvezető SIG_DFL.
  4. SA_RESTART - indítsa újra a rendszert hívás után a jelet kezelő. Ha a jelző nincs beállítva, a rendszer hívás hibát ad vissza Eintr.

Mint mindig, ha sikeres sigaction () függvény 0 és hiba esetén - negatív értéket.

folyamat jelek maszk

Hozzáadása jelek szerkezet sigset_t sa_mask, annak tisztítása, stb hajtják végre sigemptyset () funkciócsoportja, sigfillset (), sigaddset (), sigdelset (). Az első két funkció venni egy paraméter - a mutató egy szerkezet sigset_t. Ezek a funkciók, tisztított, és töltse ki az összes lehetséges jel sigset_t szerkezete volt.

Az utolsó két funkció rendre hozzá és távolítva egy adott jel szerkezetét és két paramétert. Az első érv - a mutatót sigset_t szerkezetét, és a második - a jelzés száma.

Minden a fenti funkciók visszaút 0, ha sikeres és számos nem egyenlő nullával - hiba.

Emellett van egy másik jellemzője, hogy ellenőrzi, hogy a nevezett jelet nevezett beállítva - sigismember (). Paraméterei megegyeznek sigaddset () paraméter. A függvény értéke 1, ha a jel a beállított, 0 - ha nem, és a negatív szám - ha a hibáról.

Ezen felül, tudjuk meg a riasztási lista, amelynek a szállítására a folyamat blokkolva lesz. Ez úgy történik, sigprocmask funkció (int, hogy hogyan, const sigset_t * set, sigset_t * oldset).

Az első paraméter leírja, mit kell tenni:

  1. SIG_BLOCK - jeleket egy sor készlet blokkolt;
  2. SIG_UNBLOCK - jelek halmaza set nyitva;
  3. SIG_SETMASK - jelek halmaza set blokkolva vannak, a többi nyitva.

A második paraméter egy mutató ugyanazokat a jeleket, amelyeket zárolása / feloldása. Ha ez NULL, akkor az érték az első paraméter figyelmen kívül hagyja a rendszer hívást.

A harmadik paraméter - a mutató egy szignálmaszkot már használatban van; lehet tenni NULL, ha ezeket az adatokat nem szükséges.

sigpending () függvény használható visszakeresni a függőben lévő jeleket, ami történik egyetlen paraméter - a mutatót sigset_t szerkezete, ami lesz írva sor függő jeleket.

Principles of írás jelkezelők

Az egyik legfontosabb szabály az írás jel felvezető - a felvezető kell reentráns, azaz lehetővé kell tennie a visszahívás, amikor a folyamat már a felvezető. Meg kell vigyázni, hogy a jel felvezető nem használ globális adatszerkezetet vagy lassú rendszer hívásokat. Ha elkerülni ezt, sajnos, lehetetlen, meg kell vigyázni a védelem a visszahívás felvezető során az adatszerkezet vagy a rendszer hívást. Ezt úgy lehet elérni azáltal, hogy blokkolja a szállítás időpontjában a jel, ami már működik felvezető a rendszert használó hívás sigprocmask (). Például, van egy kezelőt az SIGCHLD, vigye zár az alábbiak szerint:

Emellett az összes fenti, úgy véljük, hogy a felvezető legegyszerűbbnek kell lennie, amennyire csak lehetséges - ideális esetben kellett tenni egy zászlót, és a végén, és minden mást el kell végeznie a nagy részét a programot.

következtetés

A fenti alapanyaga egy fogalmának jeleket. Elvileg elég lesz, hogy már elkezdték használni a munka jeleket veszik.

A ciklus végén fogják mondani, hogyan lehet (és küldés) a kiegészítő jel adat, ha nincs a szokásos információkat, hogy a jel valahonnan a folyamatot.