C Programmering

POSIX-signaler med C-programmering

POSIX-signaler med C-programmering
Vi kan definere et signal som en aktivitet som utløses for å varsle en operasjon eller tråd når ankomsttidspunktet for en bestemt betydelig situasjon. Hver gang en prosedyre eller tråd gjenkjenner et signal, vil prosedyren eller tråden stoppe hva den gjør og iverksette umiddelbare tiltak. I koordinering mellom prosesser kan signalet være effektivt. I denne guiden vil du studere signalbehandlere i Linux gjennom C-språket.

Standard eller vanlige signaler:

Overskriftsfilens signal.h 'har signaler spesifisert i den som en makrokonstant. Tittelen på signalet begynte med “SIG” og innledes med en kort signaloversikt. Følgelig har ethvert signal en distinkt numerisk verdi. Programkoden skal bruke signalets navn, ikke flere signaler. Årsaken bak er at antall signaler kan variere avhengig av system, men tolkningen av navn er standard. Nedenfor er noen vanlige signaler med funksjonaliteten definert.

SIGHUP:

Dette signalet vil legge på behandlingen. SIGHUP-signalet blir kastet av for å indikere at brukerterminalen skilles fra, sannsynligvis på grunn av at en ekstern kommunikasjon er ødelagt eller legger på.

SIGINT:

Det vil forstyrre prosessen. SIGINT-signalet mottas når brukeren legger inn INTR-tasten (vanligvis Ctrl + C).

SIGQUIT:

Det vil stoppe eller avslutte behandlingen. SIGQUIT-signalet mottas når brukeren legger inn QUIT-tasten (vanligvis Ctrl + \).

SIGILL:

Den kjører når en ulovlig kommando er gitt. SIGILL-signalet opprettes når det gjøres et forsøk på å utføre en søppel eller privilegert kommando. Hver gang stabelen renner over og maskinen har problemer med å kjøre en signalkontroller, kan SIGILL også opprettes.

SIGTRAP:

Det kalles når noen sporfelleinstruksjon blir utført. SIGTRAP-signalet opprettes av en brytepunktkommando og en annen fellekommando. Feilsøkingsprogrammet bruker et slikt signal.

SIGABRT:

Det kalles Abort signal. SIGABRT-signalet opprettes ved å ringe abort () -metoden. Et slikt signal brukes til å påpeke unøyaktigheten observert av koden nevnte og registrert av abort () -metoden.

SIGFPE:

Unntak for flytende poeng; SIGFPE-signalet produseres når en katastrofal matematisk feil oppstår.

SIGUSR1 og SIGUSR2:

SIGUSR1- og SIGUSR2-signalene kan brukes slik du vil. Det er gunstig for enkel interprosessinteraksjon å opprette en signalbehandler for slike signaler i applikasjonen som får signalet.

Standard oppførsel av signaler:

Det er standard oppførsel eller handling per hvert signal, og det er mulig å justere standardadferd ved å bruke behandlerfunksjonen. Den automatiske SIGKILL- og SIGABRT-signaloppførselen kunne ikke modifiseres eller forsømmes.

Begrep: Det vil avslutte operasjonen.

Kjerne: Et kjernedumpdokument vil bli generert, og operasjonen vil bli avsluttet.

Ign: Prosessen vil overse et signal.

Stoppe: Det stopper operasjonen.

Fortsett: Operasjonen vil bli stoppet fra å bli stoppet.

Signalhåndtering:

Prosessen har en preferanse for atferd for et signal når det blir bekreftet. Prosessen kan oppføre seg slik:

Signalet avvises automatisk når den definerte signaloppførselen overses.

Ved hjelp av metoder som signal eller signering kan koden registrere en behandlerfunksjon. Det kalles å fange et signal fra en behandler.

Hvis et signal ikke blir behandlet eller forsømt, kan standard handling oppstå.

Du kan definere signalhåndteringsfunksjonen som:

$ Int signal () int signum, void (* funk) (int))

Når behandlingen får et signumsignal, kan signal () -metoden kalle "func" -metoden. Signal () tilbakestiller en peker til "func" -metoden hvis den er velstående eller et unntak returneres til errno og -1 i stedet.

Func-pekeren kan ha tre verdier:

SIG_DFL: Dette er en pekepinn til standard SIG DFL () -metoden, definert i toppteksten.h dokument som brukes for å få signalets standard oppførsel.

SIG_IGN: Dette er en referanse til SIG IGN () ignoreringsmetoden, spesifisert i overskriften.h dokument.

Brukerdefinert peker for behandlingsmetode: Den brukerdefinerte behandlingsmetodetypen void (*) (int), innebærer at returkategorien er ugyldig og at det ensomme argumentet er int.

Lag et nytt filsignal.c 'og skriv under signalhåndteringskoden i den.

Koble signalet.c-fil med gcc.

Mens du kjører signalet.c-fil, har vi en endeløs løkke som utføres i hovedmetoden. Ved å trykke CTRL + C startet det behandlermetoden, og hovedmetoden ble utført. Hovedmetodebehandlingen fortsatte etter fullføringen av behandlermetoden. Når du trykker på Ctrl + \, avsluttes operasjonen.

Signal Ignorer:

For å se over signalet, opprett et filsignal.c 'og skriv under koden i den.

Bind ignoreren.c-fil med gcc.

Kjør signalet.c-fil. Trykk CTRL + C, SIGNIT signal blir opprettet; ikke desto mindre er oppførselen ubemerket fordi behandlermetoden er oppregnet til SIG_IGN () -metoden.

Registrer signalhåndterer på nytt:

For å registrere signalbehandleren på nytt, oppretter du en ny fil 'omregistrer.c 'og skriv koden nedenfor i den:

Knytt omregistreringen.c-fil med gcc.

Kjør omregistreringen.c-fil. Mens du trykket på CTRL + C-behandlingsmetoden første gang, ble signalbehandleren registrert på nytt til SIG_DFL. Mens du trykket på CTRL + C igjen, ble henrettelsen avsluttet.

Send signaler ved hjelp av Raise ():

Lag en fil 'send.c 'og legg til koden nedenfor. For å sende signaler til anropsmetoden brukes høydemetoden ().

Forhold sendingen.c-fil med gcc.

Prosessen bruker raise () -metoden for å overføre SIGUSR1-signalet alene.

Send signaler ved hjelp av Kill ():

Legg til koden nedenfor i 'raise'.c '. Bruk kill-metoden () for å sende signaler til prosessgruppen.

Koble høyningen.c-fil med gcc.

Ved å bruke kill () -metoden, retter prosessen SIGUSR1-signalet til det ovennevnte.

Forhandling mellom foreldre og barn:

For å se foreldre-barn-interaksjon, skriv koden nedenfor i en fil.

Bond kommisjonen.c-fil med gcc.

Gaffel () / metode genererer barn, tilbakestiller null til barneprosessen og barn-ID til foreldre.

Konklusjon:

I denne guiden har vi sett hvordan vi kan lage, håndtere, sende, ignorere, omregistrere og bruke signalet for inter-prosessinteraksjon i Linux.

Hvordan bruke AutoKey til å automatisere Linux-spill
AutoKey er et desktopautomatiseringsverktøy for Linux og X11, programmert i Python 3, GTK og Qt. Ved å bruke skript og MACRO-funksjonalitet kan du aut...
Hvordan vise FPS-teller i Linux-spill
Linux-spill fikk et stort press da Valve kunngjorde Linux-støtte for Steam-klient og spillene deres i 2012. Siden den gang har mange AAA- og indiespil...
Hvordan laste ned og spille Sid Meier's Civilization VI på Linux
Introduksjon til spillet Civilization 6 er et moderne syn på det klassiske konseptet som ble introdusert i serien av Age of Empires-spillene. Ideen va...