Signaali Unix-perheen käyttöjärjestelmissä on prosessin asynkroninen ilmoitus tapahtumasta, yksi tärkeimmistä prosessien välisistä vuorovaikutuksista . Kun signaali lähetetään prosessille, käyttöjärjestelmä keskeyttää prosessin suorittamisen ja jos prosessi on asentanut oman signaalinkäsittelijän , käyttöjärjestelmä käynnistää tämän käsittelijän välittäen sille tietoa signaalista, jos prosessi ei ole asennettu käsittelijä, niin oletuskäsittelijä suoritetaan.
Signaalien nimet "SIG..." ovat numeerisia vakioita ( C - makromääritelmiä ), joiden arvot on määritetty otsikkotiedostossa . Signaalien numeeriset arvot voivat vaihdella järjestelmästä toiseen, vaikka useimmilla niistä on samat arvot eri järjestelmissä. Tapa -apuohjelman avulla voit määrittää signaalin numerona tai symbolina. signal.h
Signaalin tiedot sisältyvät POSIX - standardeihin .
Signaalit lähetetään:
Signaaleja ei voida lähettää lopetetulle prosessille, joka on zombie- tilassa .
Useimpien signaalien oletuskäsittelijä päättää prosessin. Kaikkien paitsi SIGKILL - ja SIGSTOP - signaalien vaihtoehtoiseen käsittelyyn prosessi voi määrittää oman käsittelijän tai jättää niiden esiintymisen huomioimatta muuttamalla signaalimaskiaan . Ainoa poikkeus on prosessi, jossa on pid 1 ( init ), jolla on oikeus jättää huomiotta tai käsitellä mitä tahansa signaaleja, mukaan lukien KILL ja STOP.
Prosessi (tai shell-käyttäjä), jonka todellinen UID on muu kuin 0 ( pääkäyttäjän UID), voi lähettää signaaleja vain prosesseille, joilla on sama todellinen UID.
POSIX määrittelee 28 signaalia, jotka voidaan luokitella seuraavasti:
Nimi | Koodi | Oletustoiminto | Kuvaus | Tyyppi |
---|---|---|---|---|
SIGABRT | 6 | Lopeta muistivedos | Toiminnon lähettämä signaaliabort() | Ohjaus |
SIGALRM | neljätoista | Valmistuminen | Signaali asetetun ajan päättymisestäalarm() | Ilmoitus |
SIGBUS | kymmenen | Lopeta muistivedos | Fyysisen muistin väärinkäyttö | Poikkeus |
SIGCHLD | kahdeksantoista | Ohitettu | Lapsiprosessi on lopetettu tai lopetettu | Ilmoitus |
SIGCONT | 25 | Jatka suoritusta | Jatka aiemmin pysäytettyä prosessia | Ohjaus |
SIGFPE | kahdeksan | Lopeta muistivedos | Virheellinen aritmeettinen operaatio | Poikkeus |
HUOKAA | yksi | Valmistuminen | Terminaalin sulkeminen | Ilmoitus |
SIGILL | neljä | Lopeta muistivedos | Virheellinen prosessoriohje | Poikkeus |
SIGINT | 2 | Valmistuminen | Keskeytyssignaali (Ctrl-C) terminaalista | Ohjaus |
SIGKILL | 9 | Valmistuminen | Ehdoton lopettaminen | Ohjaus |
SIGPIPE | 13 | Valmistuminen | Kirjoita katkenneeseen liitäntään (putki, pistorasia) | Ilmoitus |
SIGQUIT | 3 | Lopeta muistivedos | "Lopeta"-signaali terminaalista (Ctrl-\) | Ohjaus |
SIGSEGV | yksitoista | Lopeta muistivedos | Muistin käyttöhäiriö | Poikkeus |
SIGSTOP | 23 | Prosessin pysäyttäminen | Prosessin pysäyttäminen | Ohjaus |
SIGTERM | viisitoista | Valmistuminen | Päätesignaali (oletussignaali kill-apuohjelmalle) | Ohjaus |
SIGTSTP | kaksikymmentä | Prosessin pysäyttäminen | Pysäytyssignaali liittimestä (Ctrl-Z). | Ohjaus |
SIGTTIN | 26 | Prosessin pysäyttäminen | Yritä lukea terminaalista taustaprosessilla | Ohjaus |
SIGTTOU | 27 | Prosessin pysäyttäminen | Yritä kirjoittaa päätteeseen taustaprosessilla | Ohjaus |
SIGUSR1 | 16 | Valmistuminen | Käyttäjäsignaali #1 | Mukautettu |
SIGUSR2 | 17 | Valmistuminen | Käyttäjäsignaali #2 | Mukautettu |
SIGPOLL | 22 | Valmistuminen | Tapahtumaa seurattupoll() | Ilmoitus |
SIGPROF | 29 | Valmistuminen | Profilointiajastimen vanheneminen | Virheenkorjaus |
SIGSYS | 12 | Lopeta muistivedos | Väärä järjestelmäkutsu | Poikkeus |
SIGTRAP | 5 | Lopeta muistivedos | Jäljitysloukku tai keskeytyskohta | Virheenkorjaus |
SIGURG | 21 | Ohitettu | Kiireelliset tiedot vastaanotettu pistorasiaan | Ilmoitus |
SIGVTALRM | 28 | Valmistuminen | "Virtuaaliajastimen" vanheneminen | Ilmoitus |
SIGXCPU | kolmekymmentä | Lopeta muistivedos | Prosessi on ylittänyt suorittimen aikarajan | Poikkeus |
SIGXFSZ | 31 | Lopeta muistivedos | Prosessi on ylittänyt sallitun tiedostokoon | Poikkeus |
On myös signaaleja, joita ei ole määritelty POSIXissa, mutta niitä on joissakin käyttöjärjestelmissä.
Käsitellessään poikkeuksia ja virheenkorjaussignaaleja prosessi voi kirjoittaa tiedoston, jossa on prosessimuistivedos ( core image ) nykyiseen hakemistoon ennen lopettamista , jonka avulla debuggeri voi palauttaa olosuhteet, joissa tämä poikkeus tapahtui. Joskus (esimerkiksi pääkäyttäjänä toimiville ohjelmille) muistivedosta ei luoda turvallisuussyistä.
Yleensä signaalinkäsittelijä ottaa vain yhden argumentin, signaalin numeron (tämän avulla voit käyttää samaa käsittelijätoimintoa useille signaaleille). sigaction()Jos määrität SA_SIGINFO-vaihtoehdon signaalinkäsittelijää määritettäessä (funktiolla ), käsittelijälle välitetään kaksi muuta argumenttia:
Useimmat lisäkoodit ovat kullekin signaalille ominaisia. Kaikille signaaleille yhteiset koodit:
Koodi | Kuvaus |
---|---|
SI_USER | kill()Toiminnon (tai apuohjelman kill) lähettämä signaali |
SI_QUEUE | Toiminnon lähettämä signaalisigqueue() |
SI_TIMER | Signaali lähetetään toiminnon asettaman ajan kuluttuatimer_settime() |
SI_ASYNCIO | Signaali lähetetty "asynkronisen I/O"-pyynnön jälkeen |
SI_MESGQ | Signaali lähetetään, kun viesti ilmestyy tyhjään "Unix-viestijonoon" |
Prosessien välinen viestintä | |
---|---|
menetelmät | |
Valitut protokollat ja standardit |