Signal (Unix)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 2. september 2018; checks kræver 6 redigeringer .

Et signal i operativsystemer i Unix-familien  er en asynkron notifikation af en proces om en hændelse, en af ​​de vigtigste måder at interagere mellem processer på . Når et signal sendes til en proces, afbryder operativsystemet udførelsen af ​​processen, og hvis processen har installeret sin egen signalbehandler , starter operativsystemet denne håndtering og videregiver information om signalet til den, hvis processen ikke har installeret en handler, så udføres standardhandleren.

Signalnavne "SIG..." er numeriske konstanter ( C makro definitioner ) med værdier defineret i header-filen . De numeriske værdier af signalerne kan variere fra system til system, selvom de fleste af dem har samme værdier i forskellige systemer. Kill -værktøjet giver dig mulighed for at angive et signal som et tal eller symbol. signal.h

Signalspecifikationen er inkluderet i POSIX -standarderne .

Sender signaler

Der sendes signaler:

Signaler kan ikke sendes til en afsluttet proces, der er i zombietilstand .

Signalbehandling

Standardbehandleren for de fleste signaler afslutter processen. Til alternativ håndtering af alle signaler undtagen SIGKILL og SIGSTOP kan en proces tildele sin egen handler eller ignorere deres forekomst ved at ændre sin signalmaske . Den eneste undtagelse er en proces med pid 1 ( init ), som har ret til at ignorere eller behandle eventuelle signaler, inklusive KILL og STOP.

Sikkerhed

En proces (eller shell-bruger) med et ægte UID andet end 0 ( superbrugers UID ) kan kun sende signaler til processer med det samme rigtige UID.

Klassificering af signaler

POSIX definerer 28 signaler, der kan klassificeres som følger:

Navn Koden Standardhandling Beskrivelse Type
SIGABRT 6 Afslut med et hukommelsesdump Signalet sendt af funktionenabort() Styring
SIGALRM fjorten Færdiggørelse Signal for udløbet af den indstillede tidalarm() Notifikation
SIGBUS ti Afslut med et hukommelsesdump Misbrug af fysisk hukommelse Undtagelse
SIGCHLD atten Ignoreret Børneproces afsluttet eller stoppet Notifikation
SIGCONT 25 Fortsæt udførelsen Genoptag en tidligere stoppet proces Styring
SIGFPE otte Afslut med et hukommelsesdump Fejlagtig aritmetisk operation Undtagelse
SIGHUP en Færdiggørelse Terminal lukning Notifikation
SIGILL fire Afslut med et hukommelsesdump Ugyldig processorinstruktion Undtagelse
SIGINT 2 Færdiggørelse Afbryd signal (Ctrl-C) fra terminal Styring
SIGKILL 9 Færdiggørelse Ubetinget opsigelse Styring
SIGPIPE 13 Færdiggørelse Skriv til brudt forbindelse (rør, fatning) Notifikation
SIGQUIT 3 Afslut med et hukommelsesdump "Afslut" signal fra terminal (Ctrl-\) Styring
SIGSEGV elleve Afslut med et hukommelsesdump Hukommelsesadgangsforstyrrelse Undtagelse
SIGSTOP 23 Stopper en proces Stopper en proces Styring
SIGTERM femten Færdiggørelse Afslutningssignal (standardsignal for kill-værktøjet) Styring
SIGTSTP tyve Stopper en proces Stop signal fra terminal (Ctrl-Z). Styring
SIGTTIN 26 Stopper en proces Forsøg på at læse fra terminal ved baggrundsproces Styring
SIGTTOU 27 Stopper en proces Forsøg at skrive til terminalen ved hjælp af en baggrundsproces Styring
SIGUSR1 16 Færdiggørelse Brugersignal #1 Brugerdefinerede
SIGUSR2 17 Færdiggørelse Brugersignal #2 Brugerdefinerede
SIGPOLL 22 Færdiggørelse Hændelsen sporespoll() Notifikation
SIGPROF 29 Færdiggørelse Profileringstimerens udløb Fejlretning
SIGSYS 12 Afslut med et hukommelsesdump Forkert systemopkald Undtagelse
SIGTRAP 5 Afslut med et hukommelsesdump Sporfælde eller brudpunkt Fejlretning
SIGURG 21 Ignoreret Hastedata modtaget på socket Notifikation
SIGVTALRM 28 Færdiggørelse Udløb af den "virtuelle timer" Notifikation
SIGXCPU tredive Afslut med et hukommelsesdump Processen har overskredet CPU-tidsgrænsen Undtagelse
SIGXFSZ 31 Afslut med et hukommelsesdump Processen har overskredet den tilladte filstørrelse Undtagelse

Der er også signaler, der ikke er defineret i POSIX, men til stede på nogle operativsystemer.

Ved håndtering af undtagelser og fejlfindingssignaler kan en proces skrive en fil med et proceshukommelsesdump ( kernebillede ) til den aktuelle mappe før terminering ,  hvorved fejlfinderen kan gendanne betingelserne, hvorunder denne undtagelse opstod. Nogle gange (for eksempel for programmer, der kører som root), oprettes et hukommelsesdump af sikkerhedsmæssige årsager.

SA_SIGINFO

Normalt tager en signalhandler kun ét argument, signalnummeret (dette giver dig mulighed for at bruge den samme handlerfunktion til flere signaler). sigaction()Hvis du angiver SA_SIGINFO-indstillingen, når du indstiller signalbehandleren (ved hjælp af funktionen ), vil yderligere to argumenter blive videregivet til behandleren:

  1. peger på en struktur, siginfo_tder indeholder:
    • en bitmaske af yderligere "signalkoder", der bestemmer årsagen til dens forekomst;
    • proces-id (PID), der sendte signalet;
    • den effektive brugeridentifikator (UID), under hvilken processen (for eksempel utility kill) kører, der sendte signalet;
    • adressen på den instruktion, hvor undtagelsen fandt sted;
    • etc.
  2. en pointer til "maskinkonteksten" på det tidspunkt, hvor signalet opstod (med "signalstakken" - yderligere data, der skubbes ind på stakken, når nogle undtagelsessignaler kaldes).

De fleste ekstra koder er specifikke for hvert signal. Koder, der er fælles for alle signaler:

Koden Beskrivelse
SI_USER Signal sendt af funktion kill()(eller hjælpeprogram kill)
SI_QUEUE Signal sendt af funktionsigqueue()
SI_TIMER Signalet sendes efter den tid, der er indstillet af funktionentimer_settime()
SI_ASYNCIO Signal sendt efter afslutning af en "asynkron I/O"-anmodning
SI_MESGQ Signal sendt, når en besked vises i en tom "Unix-meddelelseskø"

Links