Signaleringsmekanismen i Linux-kjernen lar kjørende applikasjoner asynkront varsle systemet når en ny hendelse oppstår. På grunn av sin natur er denne signalmekanismen generelt kjent som programvareavbrudd. Akkurat som maskinvareavbrudd, avbryter signaler en applikasjons normale flyt, og det er uforutsigbart når en applikasjon vil motta et signal.

La oss dykke dypt inn i signalmekanismen i Linux og forstå hva som foregår bak kulissene.

Grunnleggende signalkonsepter i Linux

På Linux genererer prosesser signaler i tre grunnleggende situasjoner:

  • Når en eksepsjonell situasjon oppstår på maskinvaresiden. Du kan for eksempel tenke på hendelser som at applikasjonen prøver å få tilgang til en region utenfor tillatt adresserom (segmenteringsfeil) eller generering av maskinkode som inkluderer en divisjon med null operasjon.
  • Situasjoner som bruk av tastekombinasjoner som Ctrl + C eller Ctrl + Z på konsollen av brukeren, endre størrelse på konsollskjermen eller sende et drepesignal.
  • Tidtakeren som er angitt i applikasjonen utløper, CPU-grensen gitt til applikasjonen er høy, dataene kommer til en åpen filbeskrivelse, etc.

Konseptet med signaler har eksistert siden de tidlige versjonene av Unix. Tidligere var det flere forskjeller mellom Unix-versjoner angående signalbehandling. Senere, med POSIX-standardiseringen laget for signalhåndtering begynte Linux og andre Unix-derivater å følge disse standardene. Av denne grunn peker konseptene Unix-signaler og POSIX-signaler, som du kan støte på i enkelte dokumenter, på forskjellene.

Signalnummer

Signaler har forskjellige numeriske verdier, som starter med én. For eksempel er signal 1 a HUP signal i nesten alle systemer, eller signal 9 er en DREPE signal.

Imidlertid frarådes det sterkt å bruke disse tallene når du bruker signaler i applikasjonene dine. For POSIX-signaler, signal.h filen skal være i applikasjonen og utvikleren bør bruke konstante definisjoner av relaterte tall som f.eks SIGHUP, SIGKILL, etc. i stedet.

Hvis du undersøker /usr/include/signal.h fil på systemet ditt, kan du se tilleggsoperasjonene og andre inkluderte filer ved å se på definisjonene av verdier som __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, etc. i filen. Du kan finne tilgjengelige signalnumre på Linux-systemer i /usr/include/asm-generic/signal.h fil, som du ikke trenger å inkludere direkte i søknadskoden.

Signalgenerering og -sending

Signalgenerering oppstår på grunn av en hendelse. Sending (levering) av signalet til den aktuelle applikasjonen skjer imidlertid ikke samtidig med genereringen av signalet.

For at signalet skal sendes til applikasjonen, må applikasjonen kjøres og ha CPU-ressurser. Derfor skjer sendingen av et signal til en spesifikk applikasjon når den relevante applikasjonen begynner å fungere igjen etter kontekstbyttet.

Det ventende signalkonseptet

I løpet av tiden fra generering til overføring av signalet er signalene i standby-tilstand. Du kan få tilgang til antall ventende signaler og antall ventende signaler som er tillatt for en prosess fra /proc/PID/status fil.

# For en prosess med PID: 2299
cat /proc/2299/status

# Utgang
...
SigQ: 2/31630
...

Signalmasker og blokkering

Den nøyaktige tiden signalene vil ankomme er ofte uforutsigbar av applikasjonen. Derfor kan noen kritiske avbrudd oppstå under enhver operasjon. Dette kan skape store problemer for en storskala applikasjon.

For å forhindre noen uønskede situasjoner som dette, er det nødvendig å bruke signalmasker. Dermed er det mulig å blokkere noen signaler før en kritisk operasjon. På dette stadiet er det viktig å fullføre den kritiske delen og fjerne de definerte blokkene. Denne prosessen er noe applikasjonsutvikleren bør være oppmerksom på.

Når applikasjonen blokkerer et signal, vil andre signaler av samme type som genereres, være i ventetilstand til de deaktiveres. I applikasjonen er det også gitt sending av ventende signaler så snart blokkeringen er fjernet.

På denne måten sendes de samme typene signaler som er satt på vent ved blokkeringstidspunktet til applikasjonen kun én gang etter at blokkeringen er fjernet ved normal bruk. Situasjonen er annerledes for sanntidssignaler.

Linux-signaltyper

Standardhandlinger kan variere avhengig av signaltyper. Hvis applikasjonen som mottar det tilsvarende signalet ikke har en signalbehandlerfunksjon, finner standardhandlingen sted. Noen ganger betyr dette å avslutte applikasjonen og noen ganger ignorere signalet.

Noen signaler kan ikke fanges opp på applikasjonslaget, disse signalene utfører alltid standardhandlingen (som KILL-signalet).

I tillegg til noen handlinger som får en applikasjon til å avslutte, produseres det også en kjernedumpfil. Kjernedumpfiler, opprettet ved å skrive den virtuelle minnetabellen for den relaterte prosessen til disk, hjelper bruker å undersøke tilstandsinformasjonen før prosessen avsluttes med feilsøkingsverktøy i de neste stadiene.

Følgende verdier er basert på en eksemplarisk MIPS-arkitektur:

Signal Antall Standard handling Kan det bli fanget?
SIGHUP 1 Avslutt søknad Ja
SIGINT 2 Avslutt søknad Ja
SIGQUIT 3 Avslutt søknad (kjernedump) Ja
SIGILL 4 Avslutt søknad (kjernedump) Ja
SIGTRAP 5 Avslutt søknad (kjernedump) Ja
SIGABRT 6 Avslutt søknad (kjernedump) Ja
SIGFPE 8 Avslutt søknad (kjernedump) Ja
SIGKILL 9 Avslutt søknad Nei
SIGBUS 10 Avslutt søknad (kjernedump) Ja
SIGSEGV 11 Avslutt søknad (kjernedump) Ja
SIGSYS 12 Avslutt søknad (kjernedump) Ja
SIGPIPE 13 Avslutt søknad Ja
SIGALRM 14 Avslutt søknad Ja
SIGTERM 15 Avslutt søknad Ja
SIGUSR1 16 Avslutt søknad Ja
SIGUSR2 17 Avslutt søknad Ja
SIGCHLD 18 Overse Ja
SIGTSTP 20 Stoppe Ja
SIGURG 21 Overse Ja
SIGPOLL 22 Avslutt søknad Ja
SIG STOPP 23 Stoppe Nei
SIGCONT 25 Fortsett hvis du stopper Ja
SIGTTIN 26 Stoppe Ja
SIGTTOU 27 Stoppe Ja
SIGVTALRM 28 Avslutt søknad Ja
SIGPROF 29 Avslutt søknad Ja
SIGXCPU 30 Avslutt søknad (kjernedump) Ja
SIGXFSZ 31 Avslutt søknad (kjernedump) Ja

Livssyklus av signaler i Linux

Signalene går gjennom tre stadier. De produseres primært i produksjonsfasen, av kjernen eller en hvilken som helst prosess, og er representert med et tall. De jobber lett og raskt, da de ikke har noen ekstra belastning på seg. Men hvis du ser på POSIX-siden, vil du se at sanntidssignaler kan overføre ekstra data.

Leveringsfasen for signalene kommer etter produksjonsfasen. Normalt når signaler applikasjonen fra kjernen så raskt som mulig. Noen ganger kan imidlertid applikasjoner blokkere signaler mens de utfører kritiske operasjoner. I slike tilfeller forblir signalet ventende til transaksjonen finner sted.

I likhet med signaler er også prosesser en integrert del av Linux-økosystemet. Å forstå hva prosesser er og hvordan de fungerer er avgjørende hvis du planlegger å bli Linux-systemadministrator.

Hva er en prosess i Linux?

Les Neste

DelekvitringDeleE-post

Relaterte temaer

  • Linux
  • Linux-kjernen
  • Systemadministrasjon

Om forfatteren

Fatih Küçükkarakurt (9 artikler publisert)

En ingeniør og programvareutvikler som er en fan av matematikk og teknologi. Han har alltid likt datamaskiner, matematikk og fysikk. Han har utviklet spillmotorprosjekter samt maskinlæring, kunstige nevrale nettverk og lineære algebrabiblioteker. Videre fortsetter arbeidet med maskinlæring og lineære matriser.

Mer fra Fatih Küçükkarakurt

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!

Klikk her for å abonnere