Linuxi tuuma signaalimismehhanism võimaldab töötavatel rakendustel asünkroonselt teavitada süsteemi uue sündmuse toimumisest. Oma olemuse tõttu nimetatakse seda signaalimismehhanismi üldiselt tarkvarakatkestusteks. Nii nagu riistvarakatkestused, katkestavad signaalid rakenduse normaalse voo ja on ettearvamatu, millal rakendus signaali vastu võtab.
Sukeldume sügavale Linuxi signaalimismehhanismi ja mõistame, mis kulisside taga toimub.
Põhilised signaalikontseptsioonid Linuxis
Linuxis genereerivad protsessid signaale kolmes põhiolukorras:
- Kui riistvara poolel tekib erandlik olukord. Näiteks võite mõelda sündmustele, nagu rakendus, mis üritab pääseda juurde väljaspool piirkonda lubatud aadressiruum (segmenteerimisviga) või masinkoodi genereerimine, mis sisaldab jagamist nulliga operatsiooni.
- Olukorrad nagu klahvikombinatsioonide kasutamine nagu Ctrl + C või Ctrl + Z konsoolil kasutaja poolt, konsooliekraani suuruse muutmine või tapmissignaali saatmine.
- Rakenduses seatud taimer aegub, rakendusele antud CPU limiit on kõrge, andmed tulevad avatud faili deskriptorisse jne.
Signaalide kontseptsioon on olnud kasutusel alates Unixi esimestest versioonidest. Varem oli Unixi versioonide vahel signaalitöötluse osas mitmeid erinevusi. Hiljem koos POSIXi standardimine loodud signaalihalduse jaoks, hakkasid Linux ja teised Unixi tuletised neid standardeid järgima. Sel põhjusel viitavad Unixi signaalide ja POSIX-i signaalide mõisted, mida mõnes dokumendis võib kohata, erinevustele.
Signaali numbrid
Signaalidel on erinevad arvväärtused, alustades ühest. Näiteks signaal 1 on a HUP signaal peaaegu igas süsteemis või signaal 9 on a TAPA signaal.
Nende numbrite kasutamine ei ole aga tungivalt soovitatav, kui kasutate oma rakendustes signaale. POSIX-signaalide puhul signaal.h fail peaks olema rakenduses ja arendaja peaks kasutama seotud numbrite konstantseid määratlusi, näiteks OHA, SIGKILL, jne. selle asemel.
Kui uurite /usr/include/signal.h faili oma süsteemis, näete lisatoiminguid ja muid kaasatud faile, vaadates selliste väärtuste määratlusi nagu __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, jne. failis. Linuxi süsteemide saadaolevad signaalinumbrid leiate aadressilt /usr/include/asm-generic/signal.h faili, mida te ei pea otse oma rakenduse koodi lisama.
Signaali genereerimine ja saatmine
Signaali genereerimine toimub sündmuse tõttu. Signaali saatmine (edastus) vastavasse rakendusse ei toimu aga samaaegselt signaali genereerimisega.
Signaali saatmiseks rakendusele peab rakendus parajasti töötama ja sellel peab olema protsessori ressursse. Seetõttu toimub signaali saatmine konkreetsele rakendusele siis, kui vastav rakendus pärast kontekstivahetust uuesti tööle hakkab.
Ootel signaali kontseptsioon
Aja jooksul genereerimisest kuni signaali edastamiseni on signaalid ooterežiimis. Protsessi jaoks lubatud ootel signaalide arvule ja ootel signaalide arvule pääsete juurde aadressilt /proc/PID/status faili.
# PID-ga protsessi jaoks: 2299
kass /proc/2299/status
# Väljund
...
SigQ: 2/31630
...
Signaali maskid ja blokeerimine
Signaalide saabumise täpne aeg on rakendusele sageli ettearvamatu. Seetõttu võivad mis tahes toimingu ajal tekkida kriitilised katkestused. See võib suuremahulise rakenduse puhul põhjustada suuri probleeme.
Mõnede selliste soovimatute olukordade vältimiseks on vaja kasutada signaalmaske. Seega on võimalik mõned signaalid enne kriitilist toimingut blokeerida. Selles etapis on oluline lõpetada kriitiline osa ja eemaldada määratletud plokid. Rakenduse arendaja peaks sellele protsessile tähelepanu pöörama.
Kui rakendus blokeerib signaali, on teised genereeritud sama tüüpi signaalid ooteolekus kuni blokeeringu tühistamiseni. Rakenduses on ka ootel olevate signaalide saatmine kohe, kui blokeering on eemaldatud.
Sel viisil saadetakse blokeerimise ajal ootele pandud sama tüüpi signaalid rakendusele ainult üks kord pärast ploki eemaldamist tavakasutuses. Reaalajas signaalide puhul on olukord erinev.
Linuxi signaali tüübid
Vaiketoimingud võivad olenevalt signaalitüüpidest erineda. Kui vastavat signaali vastuvõtval rakendusel puudub signaalihalduri funktsioon, toimub vaiketoiming. Mõnikord tähendab see rakenduse lõpetamist ja mõnikord signaali ignoreerimist.
Mõningaid signaale ei saa rakenduskihis püüda, need signaalid sooritavad alati vaiketoimingu (nagu signaal KILL).
Lisaks mõnele toimingule, mis põhjustab rakenduse töö lõpetamise, luuakse ka põhitõmmisfail. Peamised dump-failid, mis on loodud seotud protsessi virtuaalse mälu tabeli kettale kirjutamisega, aitavad kasutajal on võimalik olekuteavet uurida enne protsessi lõppu järgmistes etappides silumistööriistadega.
Järgmised väärtused põhinevad an eeskujulik MIPS-arhitektuur:
Signaal | Number | Vaikimisi toiming | Kas seda saab kinni püüda? |
---|---|---|---|
OHA | 1 | Lõpetage rakendus | Jah |
SIGINT | 2 | Lõpetage rakendus | Jah |
SIGQUIT | 3 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGILL | 4 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGTRAP | 5 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGABRT | 6 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGFPE | 8 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGKILL | 9 | Lõpetage rakendus | Ei |
SIGBUS | 10 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGSEGV | 11 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGSYS | 12 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGPIPE | 13 | Lõpetage rakendus | Jah |
SIGALRM | 14 | Lõpetage rakendus | Jah |
SIGTERM | 15 | Lõpetage rakendus | Jah |
SIGUSR1 | 16 | Lõpetage rakendus | Jah |
SIGUSR2 | 17 | Lõpetage rakendus | Jah |
SIGCHLD | 18 | Ignoreeri | Jah |
SIGTSTP | 20 | Peatus | Jah |
SIGURG | 21 | Ignoreeri | Jah |
SIGPOLL | 22 | Lõpetage rakendus | Jah |
SIGSTOP | 23 | Peatus | Ei |
SIGCONT | 25 | Jätkake, kui peatute | Jah |
SIGTTIN | 26 | Peatus | Jah |
SIGTTOU | 27 | Peatus | Jah |
SIGVTALRM | 28 | Lõpetage rakendus | Jah |
SIGPROF | 29 | Lõpetage rakendus | Jah |
SIGXCPU | 30 | Lõpeta rakendus (tuuma tühjendus) | Jah |
SIGXFSZ | 31 | Lõpeta rakendus (tuuma tühjendus) | Jah |
Signaalide elutsükkel Linuxis
Signaalid läbivad kolm etappi. Neid toodetakse peamiselt tootmisfaasis tuuma või mis tahes protsessi abil ja neid tähistatakse numbriga. Need töötavad kergelt ja kiiresti, kuna neil pole lisakoormust. Kuid kui vaatate POSIX-i poolt, näete, et reaalajas signaalid võivad edastada lisaandmeid.
Signaalide edastamise faas tuleb pärast tootmisfaasi. Tavaliselt jõuavad signaalid kernelist rakendusse nii kiiresti kui võimalik. Kuid mõnikord võivad rakendused kriitiliste toimingute tegemise ajal signaale blokeerida. Sellistel juhtudel jääb signaal ootele kuni tehingu toimumiseni.
Sarnaselt signaalidele on ka protsessid Linuxi ökosüsteemi lahutamatu osa. Kui plaanite saada Linuxi süsteemiadministraatoriks, on oluline mõista, mis on protsessid ja kuidas need töötavad.
Mis on protsess Linuxis?
Loe edasi
Seotud teemad
- Linux
- Linuxi kernel
- Süsteemi administreerimine
Autori kohta

Insener ja tarkvaraarendaja, kes on matemaatika ja tehnoloogia fänn. Talle on alati meeldinud arvutid, matemaatika ja füüsika. Ta on arendanud nii mängumootorite projekte kui ka masinõpet, tehisnärvivõrke ja lineaaralgebra teeke. Lisaks jätkab ta tööd masinõppe ja lineaarsete maatriksitega.
Liituge meie uudiskirjaga
Liituge meie uudiskirjaga tehniliste näpunäidete, arvustuste, tasuta e-raamatute ja eksklusiivsete pakkumiste saamiseks!
Tellimiseks klõpsake siin