Jel (Unix)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. szeptember 2-án felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A jel a Unix család operációs rendszereiben  egy folyamat aszinkron értesítése egy eseményről, amely a folyamatok közötti interakció egyik fő módja . Amikor jelet küldenek egy folyamatnak, az operációs rendszer megszakítja a folyamat végrehajtását, és ha a folyamat saját jelkezelőt telepített , akkor az operációs rendszer elindítja ezt a kezelőt, átadva neki a jelre vonatkozó információkat, ha a folyamat nem. telepített egy kezelőt, akkor az alapértelmezett kezelő kerül végrehajtásra.

A "SIG..." jelnevek numerikus konstansok ( C makródefiníciók ), amelyek értékét a fejlécfájl határozza meg . A jelek számértékei rendszerről rendszerre változhatnak, bár legtöbbjük azonos értékkel rendelkezik a különböző rendszerekben. A kill segédprogram lehetővé teszi a jel számként vagy szimbólumként történő megadását. signal.h

A jelspecifikációt a POSIX szabványok tartalmazzák .

Jelek küldése

Jeleket küldenek:

Nem lehet jeleket küldeni egy zombi állapotú befejezett folyamatnak .

Jelfeldolgozás

A legtöbb jel alapértelmezett kezelője leállítja a folyamatot. A SIGKILL és SIGSTOP kivételével az összes jel alternatív kezeléséhez a folyamat hozzárendelheti saját kezelőjét, vagy figyelmen kívül hagyhatja azok előfordulását a jelmaszk módosításával . Az egyetlen kivétel a pid 1 ( init ) folyamat, amelynek joga van figyelmen kívül hagyni vagy feldolgozni bármilyen jelet, beleértve a KILL-et és a STOP-t.

Biztonság

A 0-tól eltérő valós UID -vel ( superfelhasználó UID-je ) rendelkező folyamat (vagy shell-felhasználó) csak az azonos valós UID-vel rendelkező folyamatoknak tud jeleket küldeni.

A jelek osztályozása

A POSIX 28 jelet határoz meg, amelyek a következők szerint osztályozhatók:

Név A kód Alapértelmezett művelet Leírás Típusú
SIGABRT 6 Vége egy memóriakiíratással A funkció által küldött jelabort() Ellenőrzés
SIGALRM tizennégy Befejezés A beállított idő lejártának jelzésealarm() Értesítés
SIGBUS tíz Vége egy memóriakiíratással A fizikai memória helytelen kezelése Kivétel
SIGCHLD tizennyolc Figyelmen kívül hagyva A gyermekfolyamat megszakadt vagy leállt Értesítés
SIGCONT 25 Folytassa a végrehajtást Folytassa a korábban leállított folyamatot Ellenőrzés
SIGFPE nyolc Vége egy memóriakiíratással Hibás aritmetikai művelet Kivétel
SÓGOTT egy Befejezés Terminál zárása Értesítés
SIGILL négy Vége egy memóriakiíratással Érvénytelen processzor utasítás Kivétel
SIGINT 2 Befejezés Megszakítási jel (Ctrl-C) a terminálról Ellenőrzés
SIGKILL 9 Befejezés Feltétel nélküli felmondás Ellenőrzés
SIGPIPE 13 Befejezés Írás szakadt csatlakozásra (cső, aljzat) Értesítés
SIGQUIT 3 Vége egy memóriakiíratással "Kilépés" jel a terminálról (Ctrl-\) Ellenőrzés
SIGSEGV tizenegy Vége egy memóriakiíratással Memória hozzáférési zavar Kivétel
SIGSTOP 23 Egy folyamat leállítása Egy folyamat leállítása Ellenőrzés
SIGTERM tizenöt Befejezés Lezáró jel (alapértelmezett jel a kill segédprogramhoz) Ellenőrzés
SIGTSTP húsz Egy folyamat leállítása Stop jel a terminálról (Ctrl-Z). Ellenőrzés
SIGTTIN 26 Egy folyamat leállítása Kísérlet a terminálról háttérfolyamattal olvasni Ellenőrzés
SIGTTOU 27 Egy folyamat leállítása Kísérlet írni a terminálra egy háttérfolyamattal Ellenőrzés
SIGUSR1 16 Befejezés Felhasználói jel #1 Egyedi
SIGUSR2 17 Befejezés Felhasználói jel #2 Egyedi
SIGPOLL 22 Befejezés Az esemény nyomon követvepoll() Értesítés
SIGPROF 29 Befejezés Profilozási időzítő lejárta Hibakeresés
SIGSYS 12 Vége egy memóriakiíratással Hibás rendszerhívás Kivétel
SIGTRAP 5 Vége egy memóriakiíratással Nyomcsapda vagy töréspont Hibakeresés
SIGURG 21 Figyelmen kívül hagyva Sürgős adat érkezett az aljzaton Értesítés
SIGVTALRM 28 Befejezés A "virtuális időzítő" lejárta Értesítés
SIGXCPU harminc Vége egy memóriakiíratással A folyamat túllépte a CPU időkorlátját Kivétel
SIGXFSZ 31 Vége egy memóriakiíratással A folyamat túllépte a megengedett fájlméretet Kivétel

Vannak olyan jelek is, amelyeket a POSIX nem definiál, de egyes operációs rendszereken jelen vannak.

A kivételek és a hibakeresési jelek kezelésekor a folyamat leállítása előtt egy folyamatmemória-kiíratást ( core image ) tartalmazó fájlt írhat az aktuális könyvtárba ,  amellyel a hibakereső visszaállíthatja azokat a feltételeket, amelyek között ez a kivétel előfordult. Néha (például rootként futó programok esetén) biztonsági okokból nem jön létre memóriakiírás.

SA_SIGINFO

Általában egy jelkezelő csak egy argumentumot vesz fel, a jel számát (ez lehetővé teszi, hogy több jelhez ugyanazt a kezelő függvényt használja). sigaction()Ha megadja a SA_SIGINFO opciót a jelkezelő beállításakor (a függvény használatával ), akkor a rendszer további két argumentumot ad át a kezelőnek:

  1. mutató egy olyan szerkezetre siginfo_t, amely tartalmazza:
    • további "jelkódok" bitmaszkja, amelyek meghatározzák az előfordulásának okát;
    • folyamatazonosító (PID), amely a jelet küldte;
    • killa tényleges felhasználói azonosító (UID), amely alatt a jelet küldő folyamat (például segédprogram ) fut;
    • annak az utasításnak a címe, amelyben a kivétel előfordult;
    • stb.
  2. egy mutató a "gépkörnyezetre" a jel keletkezésének időpontjában (a "jelverem" -vel - további adatok, amelyek a verembe kerülnek, amikor néhány kivételjelet hívnak).

A legtöbb kiegészítő kód minden jelre jellemző. Minden jelre közös kódok:

A kód Leírás
SI_USER kill()A funkció (vagy segédprogram kill) által küldött jel
SI_QUEUE A funkció által küldött jelsigqueue()
SI_TIMER A jel a funkció által beállított idő után kerül elküldésretimer_settime()
SI_ASYNCIO Jelet küldtek egy "aszinkron I/O" kérés teljesítésekor
SI_MESGQ Jelet küld, amikor egy üzenet megjelenik egy üres "Unix üzenetsorban"

Linkek