Signaali (Unix)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 2. syyskuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 6 muokkausta .

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 .

Lähetetään signaaleja

Signaalit lähetetään:

Signaaleja ei voida lähettää lopetetulle prosessille, joka on zombie- tilassa .

Signaalinkäsittely

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.

Turvallisuus

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.

Signaalien luokitus

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ä.

SA_SIGINFO

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:

  1. osoitin rakenteeseen, siginfo_tjoka sisältää:
    • bitimaski ylimääräisistä "signaalikoodeista", jotka määrittävät sen esiintymisen syyn;
    • prosessitunnus (PID), joka lähetti signaalin;
    • tehokas käyttäjätunnus (UID), jonka alla signaalin lähettänyt prosessi (esimerkiksi apuohjelma kill) on käynnissä;
    • sen käskyn osoite, jossa poikkeus tapahtui;
    • jne.
  2. osoitin "konekontekstiin" signaalin esiintymishetkellä ("signaalipinolla" - lisädataa, joka työnnetään pinoon, kun joitain poikkeussignaaleja kutsutaan).

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"

Linkit