Signalizacijos mechanizmas Linux branduolyje leidžia veikiančioms programoms asinchroniškai pranešti sistemai, kai įvyksta naujas įvykis. Dėl savo pobūdžio šis signalizacijos mechanizmas paprastai vadinamas programinės įrangos pertraukimais. Lygiai taip pat, kaip aparatinės įrangos pertraukimai, signalai pertraukia įprastą programos srautą ir nenuspėjama, kada programa gaus signalą.

Pasinerkime į Linux signalizacijos mechanizmą ir supraskime, kas vyksta užkulisiuose.

Pagrindinės „Linux“ signalo sąvokos

Linux sistemoje procesai generuoja signalus trimis pagrindinėmis situacijomis:

  • Kai įvyksta išskirtinė situacija aparatūros pusėje. Pavyzdžiui, galite galvoti apie tokius įvykius kaip programa, bandanti pasiekti regioną, esantį už jo ribų leistina adresų erdvė (segmentavimo gedimas) arba mašinos kodo generavimas, apimantis padalijimą iš nulio operacija.
  • Tokios situacijos kaip klavišų kombinacijų naudojimas kaip Ctrl + C arba Ctrl + Z konsolėje vartotojas, pakeisdamas konsolės ekrano dydį arba siųsdamas nužudymo signalą.
  • instagram viewer
  • Programoje nustatytas laikmatis baigiasi, programai suteiktas procesoriaus limitas didelis, duomenys ateina į atidarytą failo aprašą ir pan.

Signalų samprata egzistuoja nuo ankstyvųjų Unix versijų. Anksčiau buvo keletas skirtumų tarp Unix versijų, susijusių su signalo apdorojimu. Vėliau, su POSIX standartizacija sukurta signalų valdymui, Linux ir kiti Unix dariniai pradėjo vadovautis šiais standartais. Dėl šios priežasties Unix signalų ir POSIX signalų sąvokos, su kuriomis galite susidurti kai kuriuose dokumentuose, rodo skirtumus.

Signalo numeriai

Signalai turi įvairias skaitines reikšmes, pradedant nuo vienos. Pavyzdžiui, 1 signalas yra a HUP signalas beveik kiekvienoje sistemoje arba signalas 9 yra a NUŽUDYTI signalas.

Tačiau labai nerekomenduojama naudoti šių skaičių, kai programose naudojate signalus. POSIX signalams, signalas.h failas turi būti programoje, o kūrėjas turėtų naudoti nuolatinius susijusių skaičių apibrėžimus, pvz., SIGHUP, SIGKILLir kt. vietoj to.

Jei išnagrinėsite /usr/include/signal.h failą savo sistemoje, galite pamatyti papildomas operacijas ir kitus įtrauktus failus žiūrėdami į reikšmių apibrėžimus, pvz., __USE_POSIX, __USE_XOPEN, __USE_POSIX199309ir kt. byloje. Galimus signalų numerius Linux sistemose galite rasti /usr/include/asm-generic/signal.h failą, kurio nereikia tiesiogiai įtraukti į programos kodą.

Signalo generavimas ir siuntimas

Signalas generuojamas dėl įvykio. Tačiau signalo siuntimas (perdavimas) į atitinkamą programą nevyksta kartu su signalo generavimu.

Kad signalas būtų siunčiamas į programą, programa turi veikti ir turėti procesoriaus išteklių. Todėl signalas siunčiamas konkrečiai programai, kai atitinkama programa vėl pradeda veikti po konteksto perjungimo.

Laukimo signalo koncepcija

Nuo generavimo iki signalo perdavimo signalai yra budėjimo būsenoje. Laukiančių signalų skaičių ir laukiančių signalų skaičių, leidžiamą procesui, galite pasiekti iš /proc/PID/status failą.

# Procesui su PID: 2299
cat /proc/2299/status

# Išvestis
...
SigQ: 2/31630
...

Signalų kaukės ir blokavimas

Programa dažnai nenuspėjama tikslaus signalų gavimo laiko. Todėl bet kurios operacijos metu gali įvykti kai kurie kritiniai trikdžiai. Tai gali sukelti didelių problemų naudojant didelio masto programą.

Norint išvengti tokių nepageidaujamų situacijų, kaip ši, būtina naudoti signalines kaukes. Taigi galima užblokuoti kai kuriuos signalus prieš atliekant kritinę operaciją. Šiame etape svarbu užbaigti kritinę dalį ir pašalinti apibrėžtus blokus. Į šį procesą programos kūrėjas turėtų atkreipti dėmesį.

Kai programa blokuoja signalą, kiti sugeneruoti to paties tipo signalai bus laukimo būsenoje, kol bus atblokuoti. Programoje taip pat numatytas laukiančių signalų siuntimas, kai tik blokas pašalinamas.

Tokiu būdu tos pačios rūšies signalai, sulaikyti blokavimo metu, į programą siunčiami tik vieną kartą, kai blokas pašalinamas įprastai naudojant. Realaus laiko signalų situacija yra kitokia.

„Linux“ signalų tipai

Numatytieji veiksmai gali skirtis priklausomai nuo signalo tipų. Jei programa, kuri gauna atitinkamą signalą, neturi signalo apdorojimo funkcijos, įvyksta numatytasis veiksmas. Kartais tai reiškia programos nutraukimą, o kartais signalo ignoravimą.

Kai kurių signalų negalima užfiksuoti programos lygmenyje, šie signalai visada atlieka numatytąjį veiksmą (pvz., signalą KILL).

Be kai kurių veiksmų, dėl kurių programa nutraukiama, taip pat sukuriamas pagrindinis iškelties failas. Pagrindiniai iškelties failai, sukurti įrašant susijusio proceso virtualiosios atminties lentelę į diską, padeda vartotojas gali ištirti būsenos informaciją prieš pasibaigiant procesui su derinimo įrankiais kituose etapuose.

Šios reikšmės yra pagrįstos an pavyzdinė MIPS architektūra:

Signalas Skaičius Numatytasis veiksmas Ar galima pagauti?
SIGHUP 1 Nutraukti programą Taip
SIGINTAS 2 Nutraukti programą Taip
SIGQUIT 3 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGILL 4 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGTRAP 5 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGABRT 6 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGFPE 8 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGKILL 9 Nutraukti programą Nr
SIGBUS 10 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGSEGV 11 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGSYS 12 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGPIPE 13 Nutraukti programą Taip
SIGALRM 14 Nutraukti programą Taip
SIGTERM 15 Nutraukti programą Taip
SIGUSR1 16 Nutraukti programą Taip
SIGUSR2 17 Nutraukti programą Taip
SIGCHLD 18 Ignoruoti Taip
SIGTSTP 20 Sustabdyti Taip
SIGURGAS 21 Ignoruoti Taip
SIGPOLL 22 Nutraukti programą Taip
SIGSTOP 23 Sustabdyti Nr
SIGCONT 25 Tęskite, jei sustojote Taip
SIGTTINAS 26 Sustabdyti Taip
SIGTTOU 27 Sustabdyti Taip
SIGVTALRM 28 Nutraukti programą Taip
SIGPROF 29 Nutraukti programą Taip
SIGXCPU 30 Nutraukti programą (pagrindinis iškeldinimas) Taip
SIGXFSZ 31 Nutraukti programą (pagrindinis iškeldinimas) Taip

Signalų gyvavimo ciklas sistemoje „Linux“.

Signalai pereina tris etapus. Jie daugiausia gaminami gamybos fazėje, naudojant branduolį arba bet kokį procesą, ir yra pavaizduoti skaičiumi. Jie dirba lengvai ir greitai, nes neturi papildomos apkrovos. Bet jei pažvelgsite į POSIX pusę, pamatysite, kad realaus laiko signalai gali perduoti papildomus duomenis.

Signalų pristatymo fazė ateina po gamybos etapo. Paprastai signalai iš branduolio programą pasiekia kuo greičiau. Tačiau kartais programos gali blokuoti signalus atlikdamos svarbias operacijas. Tokiais atvejais signalas lieka laukiamas, kol įvyksta operacija.

Kaip ir signalai, procesai taip pat yra neatsiejama Linux ekosistemos dalis. Jei planuojate tapti Linux sistemos administratoriumi, labai svarbu suprasti, kas yra procesai ir kaip jie veikia.

Kas yra procesas Linux sistemoje?

Skaitykite toliau

DalintisTviteryjeDalintisEl. paštas

Susijusios temos

  • Linux
  • Linux branduolys
  • Sistemos administravimas

Apie autorių

Fatihas Küçükkarakurtas (9 straipsniai paskelbti)

Inžinierius ir programinės įrangos kūrėjas, kuris yra matematikos ir technologijų gerbėjas. Jam visada patiko kompiuteriai, matematika ir fizika. Jis sukūrė žaidimų variklių projektus, taip pat mašininį mokymąsi, dirbtinius neuroninius tinklus ir tiesinės algebros bibliotekas. Be to, toliau dirba su mašininiu mokymusi ir tiesinėmis matricomis.

Daugiau iš Fatih Küçükkarakurt

Prenumeruokite mūsų naujienlaiškį

Prisijunkite prie mūsų naujienlaiškio, kad gautumėte techninių patarimų, apžvalgų, nemokamų el. knygų ir išskirtinių pasiūlymų!

Norėdami užsiprenumeruoti, spustelėkite čia