Mehanizam signalizacije u jezgri Linuxa omogućuje pokrenutim aplikacijama da asinkrono obavijeste sustav kada se dogodi novi događaj. Zbog svoje prirode, ovaj mehanizam signalizacije općenito je poznat kao softverski prekidi. Baš kao hardverski prekidi, signali prekidaju normalan tijek aplikacije i nepredvidivo je kada će aplikacija primiti signal.
Zaronimo duboko u mehanizam signalizacije u Linuxu i shvatimo što se događa iza kulisa.
Osnovni koncepti signala u Linuxu
Na Linuxu procesi generiraju signale u tri osnovne situacije:
- Kada se dogodi iznimna situacija na hardverskoj strani. Na primjer, možete razmišljati o događajima kao što je aplikacija koja pokušava pristupiti regiji izvan dopušteni adresni prostor (greška segmentacije) ili generiranje strojnog koda koji uključuje podjelu nulom operacija.
- Situacije poput korištenja kombinacija tipki poput Ctrl + C ili Ctrl + Z na konzoli od strane korisnika, mijenjanje veličine zaslona konzole ili slanje signala za ukidanje.
- Tajmer postavljen u aplikaciji istječe, CPU ograničenje dano aplikaciji je visoko, podaci dolaze u otvoreni deskriptor datoteke itd.
Koncept signala postoji još od ranih verzija Unixa. Prije je postojalo nekoliko razlika između verzija Unixa u pogledu obrade signala. Kasnije, sa standardizacija POSIX napravljen za upravljanje signalima, Linux i drugi derivati Unixa počeli su slijediti ove standarde. Iz tog razloga koncepti Unix signala i POSIX signala, koje možete susresti u nekim dokumentima, ukazuju na razlike.
Signalni brojevi
Signali imaju različite numeričke vrijednosti, počevši od jedne. Na primjer, signal 1 je a HUP signal u gotovo svakom sustavu, ili signal 9 je a UBITI signal.
Međutim, upotreba ovih brojeva se ne preporučuje kada koristite signale u svojim aplikacijama. Za POSIX signale, signal.h datoteka bi trebala biti u aplikaciji, a programer bi trebao koristiti stalne definicije povezanih brojeva kao što su UZDIHANJE, SIGKILL, itd. umjesto toga.
Ako pregledate /usr/include/signal.h datoteku na vašem sustavu, možete vidjeti dodatne operacije i druge uključene datoteke gledajući definicije vrijednosti kao što su __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, itd. u datoteci. Dostupne brojeve signala na Linux sustavima možete pronaći u /usr/include/asm-generic/signal.h datoteku, koju ne morate uključiti izravno u kôd aplikacije.
Generiranje i slanje signala
Generiranje signala nastaje zbog događaja. Međutim, slanje (isporuka) signala relevantnoj aplikaciji ne događa se istovremeno s generiranjem signala.
Da bi se signal poslao aplikaciji, aplikacija mora biti trenutno pokrenuta i imati CPU resurse. Stoga se slanje signala određenoj aplikaciji događa kada relevantna aplikacija ponovno počne raditi nakon promjene konteksta.
Koncept signala na čekanju
Tijekom vremena od generiranja do prijenosa signala, signali su u stanju pripravnosti. Možete pristupiti broju signala na čekanju i broju signala na čekanju dopuštenih za proces iz /proc/PID/status datoteka.
# Za proces s PID-om: 2299
mačka /proc/2299/status
# Izlaz
...
SigQ: 2/31630
...
Signalne maske i blokiranje
Aplikacija često ne može predvidjeti točno vrijeme kada će signali stići. Stoga se tijekom bilo koje operacije mogu pojaviti neki kritični prekidi. To može uzrokovati velike probleme za primjenu velikih razmjera.
Kako bi se spriječile ovakve nepoželjne situacije, potrebno je koristiti signalne maske. Tako je moguće blokirati neke signale prije kritične operacije. U ovoj fazi važno je dovršiti kritični dio i ukloniti definirane blokove. Ovaj proces je nešto na što bi programer aplikacije trebao obratiti pažnju.
Kada aplikacija blokira signal, drugi generirani signali iste vrste bit će u stanju čekanja dok se ne deblokiraju. U aplikaciji je također omogućeno slanje signala na čekanju čim se blok ukloni.
Na taj način, iste vrste signala stavljenih na čekanje u vrijeme blokade šalju se aplikaciji samo jednom nakon što se blok ukloni u normalnoj upotrebi. Situacija je drugačija za signale u stvarnom vremenu.
Vrste signala za Linux
Zadane radnje mogu se razlikovati ovisno o vrsti signala. Ako aplikacija koja prima odgovarajući signal nema funkciju rukovanja signalom, izvršava se zadana radnja. Ponekad to znači prekid aplikacije, a ponekad ignoriranje signala.
Neki signali se ne mogu uhvatiti na aplikacijskom sloju, ti signali uvijek izvode zadanu radnju (kao što je KILL signal).
Uz neke radnje koje uzrokuju prekid aplikacije, također se proizvodi datoteka s ispisom jezgre. Core dump datoteke, stvorene pisanjem tablice virtualne memorije povezanog procesa na disk, pomažu korisnik da ispita informacije o stanju prije nego što proces završi s alatima za otklanjanje pogrešaka u sljedećim fazama.
Sljedeće vrijednosti temelje se na an uzorna MIPS arhitektura:
Signal | Broj | Zadana radnja | Može li se uhvatiti? |
---|---|---|---|
UZDIHANJE | 1 | Prekinite aplikaciju | Da |
SIGINT | 2 | Prekinite aplikaciju | Da |
SIGQUIT | 3 | Prekini aplikaciju (dump jezgre) | Da |
SIGILL | 4 | Prekini aplikaciju (dump jezgre) | Da |
SIGTRAP | 5 | Prekini aplikaciju (dump jezgre) | Da |
SIGABRT | 6 | Prekini aplikaciju (dump jezgre) | Da |
SIGFPE | 8 | Prekini aplikaciju (dump jezgre) | Da |
SIGKILL | 9 | Prekinite aplikaciju | Ne |
SIGBUS | 10 | Prekini aplikaciju (dump jezgre) | Da |
SIGSEGV | 11 | Prekini aplikaciju (dump jezgre) | Da |
SIGSYS | 12 | Prekini aplikaciju (dump jezgre) | Da |
SIGPIPE | 13 | Prekinite aplikaciju | Da |
SIGALRM | 14 | Prekinite aplikaciju | Da |
SIGTERM | 15 | Prekinite aplikaciju | Da |
SIGUSR1 | 16 | Prekinite aplikaciju | Da |
SIGUSR2 | 17 | Prekinite aplikaciju | Da |
SIGCHLD | 18 | Zanemariti | Da |
SIGTSTP | 20 | Stop | Da |
SIGURG | 21 | Zanemariti | Da |
SIGPOLL | 22 | Prekinite aplikaciju | Da |
SIGSTOP | 23 | Stop | Ne |
SIGCONT | 25 | Nastavite ako ste zaustavljeni | Da |
SIGTTIN | 26 | Stop | Da |
SIGTTOU | 27 | Stop | Da |
SIGVTALRM | 28 | Prekinite aplikaciju | Da |
SIGPROF | 29 | Prekinite aplikaciju | Da |
SIGXCPU | 30 | Prekini aplikaciju (dump jezgre) | Da |
SIGXFSZ | 31 | Prekini aplikaciju (dump jezgre) | Da |
Životni ciklus signala u Linuxu
Signali prolaze kroz tri faze. Proizvode se prvenstveno u fazi proizvodnje, jezgrom ili bilo kojim procesom, a predstavljeni su brojem. Djeluju lagano i brzo, jer nemaju dodatno opterećenje. Ali ako pogledate POSIX stranu, vidjet ćete da signali u stvarnom vremenu mogu prenositi dodatne podatke.
Faza isporuke za signale dolazi nakon faze proizvodnje. Obično signali iz kernela stignu do aplikacije što je brže moguće. Međutim, ponekad aplikacije mogu blokirati signale dok obavljaju kritične operacije. U takvim slučajevima signal ostaje na čekanju dok se transakcija ne izvrši.
Kao i signali, procesi su također sastavni dio Linux ekosustava. Razumijevanje što su procesi i kako rade ključno je ako planirate postati administrator sustava Linux.
Što je proces u Linuxu?
Pročitajte dalje
Povezane teme
- Linux
- Linux kernel
- Administracija sustava
O autoru

Inženjer i programer koji je ljubitelj matematike i tehnologije. Oduvijek je volio računala, matematiku i fiziku. Razvio je projekte motora za igre, kao i strojno učenje, umjetne neuronske mreže i biblioteke linearne algebre. Štoviše, nastavlja raditi na strojnom učenju i linearnim matricama.
Pretplatite se na naše obavijesti
Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e-knjige i ekskluzivne ponude!
Kliknite ovdje za pretplatu