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.
  • instagram viewer
  • 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

JaaTweetJaaSähköposti

Liittyvät aiheet

  • Linux
  • Linux-ydin
  • Järjestelmänhallinta

Kirjailijasta

Fatih Küçükkarakurt (9 artikkelia julkaistu)

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.

Lisää Fatih Küçükkarakurtilta

tilaa uutiskirjeemme

Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e-kirjoja ja eksklusiivisia tarjouksia!

Klikkaa tästä tilataksesi