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 .
Jeleket küldenek:
Nem lehet jeleket küldeni egy zombi állapotú befejezett folyamatnak .
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.
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 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.
Á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:
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" |
Folyamatközi kommunikáció | |
---|---|
Mód | |
Válogatott protokollok és szabványok |