Linux-ytimen signalointimekanismin avulla käynnissä olevat sovellukset voivat ilmoittaa järjestelmälle asynkronisesti, kun uusi tapahtuma tapahtuu. Luonteensa vuoksi tämä signalointimekanismi tunnetaan yleisesti ohjelmistokeskeytyksinä. Aivan kuten laitteiston keskeytykset, signaalit keskeyttävät sovelluksen normaalin kulun, ja on arvaamatonta, milloin sovellus vastaanottaa signaalin.
Sukellaan syvälle Linuxin signalointimekanismiin ja ymmärrämme, mitä kulissien takana tapahtuu.
Signaalin peruskäsitteet Linuxissa
Linuxissa prosessit luovat signaaleja kolmessa perustilanteessa:
- Kun laitteistopuolella tapahtuu poikkeuksellinen tilanne. Voit esimerkiksi ajatella tapahtumia, kuten sovellusta, joka yrittää käyttää alueen ulkopuolella olevaa aluetta sallittu osoiteavaruus (segmentointivika) tai konekoodin generointi, joka sisältää jaon nollalla operaatio.
- Tilanteet, kuten näppäinyhdistelmien käyttö, kuten Ctrl + C tai Ctrl + Z käyttäjä voi muuttaa konsolin näytön kokoa tai lähettää tapposignaalin.
- Sovelluksessa asetettu ajastin vanhenee, sovellukselle annettu CPU-raja on korkea, data tulee avoimeen tiedostokuvaajaan jne.
Signaalien käsite on ollut olemassa Unixin varhaisista versioista lähtien. Aiemmin Unix-versioiden välillä oli useita eroja signaalinkäsittelyssä. Myöhemmin kanssa POSIX-standardi tehty signaalinhallintaan, Linux ja muut Unix-johdannaiset alkoivat noudattaa näitä standardeja. Tästä syystä Unix- ja POSIX-signaalien käsitteet, joita saatat kohdata joissakin asiakirjoissa, viittaavat eroihin.
Signaalin numerot
Signaaleilla on erilaisia numeerisia arvoja, alkaen yhdestä. Esimerkiksi signaali 1 on a HUP signaali lähes kaikissa järjestelmissä, tai signaali 9 on a TAPPAA signaali.
Näiden numeroiden käyttöä ei kuitenkaan suositella, jos käytät signaaleja sovelluksissasi. POSIX-signaaleille, signaali.h tiedoston tulee olla sovelluksessa ja kehittäjän tulee käyttää vakiomäärityksiä vastaaville numeroille, kuten HUOKAA, SIGKILL, jne. sen sijaan.
Jos tutkit /usr/include/signal.h tiedosto järjestelmässäsi, voit nähdä lisätoiminnot ja muut mukana olevat tiedostot tarkastelemalla arvojen määritelmiä, kuten __USE_POSIX, __KÄYTÄ_XOPEN, __USE_POSIX199309, jne. tiedostossa. Löydät Linux-järjestelmissä käytettävissä olevat signaalinumerot osoitteesta /usr/include/asm-generic/signal.h tiedostoa, jota sinun ei tarvitse sisällyttää suoraan sovelluskoodiisi.
Signaalin luominen ja lähettäminen
Signaalin muodostus johtuu tapahtumasta. Signaalin lähettäminen (toimittaminen) asiaankuuluvalle sovellukselle ei kuitenkaan tapahdu samanaikaisesti signaalin synnyttämisen kanssa.
Jotta signaali voidaan lähettää sovellukselle, sovelluksen on oltava käynnissä ja sillä on oltava CPU-resurssit. Siksi signaalin lähettäminen tietylle sovellukselle tapahtuu, kun asianomainen sovellus alkaa toimia uudelleen kontekstin vaihdon jälkeen.
Odottavan signaalin käsite
Signaalin generoimisesta sen lähettämiseen välisenä aikana signaalit ovat valmiustilassa. Voit tarkastella odottavien signaalien määrää ja prosessille sallittujen odottavien signaalien määrää osoitteesta /proc/PID/status tiedosto.
# Prosessille, jossa on PID: 2299
cat /proc/2299/status
# Lähtö
...
SigQ: 2/31630
...
Signaalinaamarit ja esto
Sovellus ei usein voi ennustaa signaalien tarkkaa saapumisaikaa. Tästä syystä kriittisiä keskeytyksiä saattaa ilmetä minkä tahansa toiminnan aikana. Tämä voi aiheuttaa suuria ongelmia laajamittaisissa sovelluksissa.
Joidenkin tämän kaltaisten ei-toivottujen tilanteiden estämiseksi on käytettävä signaalimaskeja. Näin ollen on mahdollista estää jotkin signaalit ennen kriittistä toimenpidettä. Tässä vaiheessa on tärkeää suorittaa kriittinen osa ja poistaa määritellyt lohkot. Tämä prosessi on asia, johon sovelluksen kehittäjän tulee kiinnittää huomiota.
Kun sovellus estää signaalin, muut samantyyppiset generoidut signaalit ovat odotustilassa, kunnes ne poistetaan. Sovelluksessa tarjotaan myös odottavien signaalien lähettäminen heti, kun esto on poistettu.
Tällä tavalla samantyyppiset eston hetkellä pitoon asetetut signaalit lähetetään sovellukselle vain kerran sen jälkeen, kun lohko on normaalikäytössä poistettu. Tilanne on erilainen reaaliaikaisten signaalien osalta.
Linuxin signaalityypit
Oletustoiminnot voivat vaihdella signaalityyppien mukaan. Jos vastaavan signaalin vastaanottavassa sovelluksessa ei ole signaalinkäsittelytoimintoa, tapahtuu oletustoiminto. Joskus tämä tarkoittaa sovelluksen lopettamista ja joskus signaalin huomioimista.
Joitakin signaaleja ei voida siepata sovellustasolla, nämä signaalit suorittavat aina oletustoiminnon (kuten KILL-signaalin).
Joidenkin toimintojen lisäksi, jotka aiheuttavat sovelluksen sulkemisen, tuotetaan myös ydinvedostiedosto. Ydinvedostiedostot, jotka on luotu kirjoittamalla siihen liittyvän prosessin virtuaalimuistitaulukko levylle, auttavat käyttäjä voi tutkia tilatietoja ennen prosessin päättymistä seuraavissa vaiheissa olevien virheenkorjaustyökalujen avulla.
Seuraavat arvot perustuvat an esimerkillinen MIPS-arkkitehtuuri:
Signaali | Määrä | Oletustoiminto | Voidaanko se kiinni? |
---|---|---|---|
HUOKAA | 1 | Lopeta sovellus | Joo |
SIGINT | 2 | Lopeta sovellus | Joo |
SIGQUIT | 3 | Lopeta sovellus (ydinvedos) | Joo |
SIGILL | 4 | Lopeta sovellus (ydinvedos) | Joo |
SIGTRAP | 5 | Lopeta sovellus (ydinvedos) | Joo |
SIGABRT | 6 | Lopeta sovellus (ydinvedos) | Joo |
SIGFPE | 8 | Lopeta sovellus (ydinvedos) | Joo |
SIGKILL | 9 | Lopeta sovellus | Ei |
SIGBUS | 10 | Lopeta sovellus (ydinvedos) | Joo |
SIGSEGV | 11 | Lopeta sovellus (ydinvedos) | Joo |
SIGSYS | 12 | Lopeta sovellus (ydinvedos) | Joo |
SIGPIPE | 13 | Lopeta sovellus | Joo |
SIGALRM | 14 | Lopeta sovellus | Joo |
SIGTERM | 15 | Lopeta sovellus | Joo |
SIGUSR1 | 16 | Lopeta sovellus | Joo |
SIGUSR2 | 17 | Lopeta sovellus | Joo |
SIGCHLD | 18 | Jättää huomiotta | Joo |
SIGTSTP | 20 | Lopettaa | Joo |
SIGURG | 21 | Jättää huomiotta | Joo |
SIGPOLL | 22 | Lopeta sovellus | Joo |
SIGSTOP | 23 | Lopettaa | Ei |
SIGCONT | 25 | Jatka jos pysähtyy | Joo |
SIGTTIN | 26 | Lopettaa | Joo |
SIGTTOU | 27 | Lopettaa | Joo |
SIGVTALRM | 28 | Lopeta sovellus | Joo |
SIGPROF | 29 | Lopeta sovellus | Joo |
SIGXCPU | 30 | Lopeta sovellus (ydinvedos) | Joo |
SIGXFSZ | 31 | Lopeta sovellus (ydinvedos) | Joo |
Signaalien elinkaari Linuxissa
Signaalit käyvät läpi kolme vaihetta. Niitä tuotetaan ensisijaisesti tuotantovaiheessa, ytimen tai minkä tahansa prosessin avulla, ja niitä edustaa numero. Ne toimivat kevyesti ja nopeasti, koska niillä ei ole ylimääräistä kuormitusta. Mutta jos katsot POSIX-puolta, huomaat, että reaaliaikaiset signaalit voivat lähettää ylimääräistä dataa.
Signaalien toimitusvaihe tulee tuotantovaiheen jälkeen. Normaalisti signaalit saavuttavat sovelluksen ytimestä mahdollisimman nopeasti. Joskus sovellukset voivat kuitenkin estää signaalit suorittaessaan kriittisiä toimintoja. Tällaisissa tapauksissa signaali jää odottamaan, kunnes tapahtuma tapahtuu.
Kuten signaalit, myös prosessit ovat olennainen osa Linux-ekosysteemiä. Prosessien ja niiden toiminnan ymmärtäminen on ratkaisevan tärkeää, jos suunnittelet Linux-järjestelmänvalvojaksi ryhtymistä.
Mikä on prosessi Linuxissa?
Lue Seuraava
Liittyvät aiheet
- Linux
- Linux-ydin
- Järjestelmänhallinta
Kirjailijasta

Insinööri ja ohjelmistokehittäjä, joka on matematiikan ja tekniikan fani. Hän on aina pitänyt tietokoneista, matematiikasta ja fysiikasta. Hän on kehittänyt pelimoottoriprojekteja sekä koneoppimista, keinotekoisia hermoverkkoja ja lineaarisia algebrakirjastoja. Lisäksi työskentelee edelleen koneoppimisen ja lineaaristen matriisien parissa.
tilaa uutiskirjeemme
Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia e-kirjoja ja eksklusiivisia tarjouksia!
Klikkaa tästä tilataksesi