Posix signaler i C

Posix signaler i C

“Mens du kjører i veikanten, hva gjør du når du har et møte med et rødt signal? Du slutter å kjøre en stund for å vente på din tur til signalet blir grønt. Tilsvarende, når et signal har en oransje farge, fortsetter du å kjøre og aldri stoppe. Posix -signaler fungerer på samme måte som trafikksignalet fungerer. POSIX -signalbiblioteket kom med en veldig enkel funksjon som skal brukes i C -koden for å generere signaler, få programmene dine til å vente på utførelsen, og mange flere. Denne artikkelen vil demonstrere alle disse signalfunksjonene. Vi har startet eksemplene våre med opprettelsen og åpningen av en C -fil.”

Eksempel 01

Innenfor det aller første POSIX -eksemplet på signaler, vil vi demonstrere bruken av et enkelt signal () -funksjon for å lage og påkalle et signal. Derfor har vi brukt signalet.H Library of C for å bruke signalfunksjonene, STDIO.H -bibliotek brukes til standardutgangs- og inngangsfunksjoner og UNISTD.H bibliotek brukes til å bruke brukerdefinerte strukturer, i.e., funksjoner. Koden inneholder en enkel behandlerfunksjon som heter “Håndtak” med heltallstype -argument “S.”Denne variabelen“ S ”vil fungere som et signal. Den inneholder en enkel printf -setning for å sende et signal "stopp" til brukeren.

Hoved () -funksjonen starter med å lage et signal ved hjelp av "signal" -funksjonen her mens du bruker alternativet "Sigint" for å initialisere et signal og "håndtaket" -funksjonen for å bruke denne funksjonen som en signalbehandler. "For" -sløyfen starter fra "1", men den har ingen ende, jeg.e., Det kommer til å øke, men stopper aldri før du gjør det selv ved å forlate programmet. Loopen inneholder en Printf -uttalelse av C for å vise at vi for øyeblikket er i hovedfunksjonen (). Ved å bruke CTRL+C -snarveien, kan vi påkalle håndtaket () for å vise en signalmelding.

På hver iterasjon av "for" -sløyfen sover den i 5 sekunder og blir deretter økt. La oss utføre signalet C -koden vår etter å ha lagret og fjernet feilene riktig.

#inkludere
#inkludere
#inkludere
voidhåndtak (int s)
printf ("\ nstop ... \ n");

int main ()
signal (sigint, håndtak);
for (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
søvn (5);
retur 0;

Når du kjører dette programmet med kompilatoren av “C” og utfører det med “.en/.ut "-spørsmålet, vil du se en uendelig utførelse av hoved () -tråden.

Når vi trykket på “Ctrl+C” for å påkalle signalbehandlerfunksjonen, blir håndtaket () -funksjonen utført, og den viste “Stopp” for øyeblikket. Etter det går kontrollen igjen til Main () -metoden, og den begynner igjen å utføre sin Printf -setning ved hjelp av den uendelige “For” -sløyfen. Vi trykket på hurtigtasten “Ctrl+Z” for å stoppe dette programmet kraftig.

La oss si at du vil ignorere signalet påkalt av en bruker. Dette kan gjøres ved hjelp av SIG_IGN -parameteren til signalet () -funksjonen uten å bruke noen behandlerfunksjon. Vi bruker den samme koden med en liten endring i signalet () -funksjonen. Ved å bruke denne funksjonen, når en bruker påkaller et signal ved å bruke snarveien “Ctrl+C”, vil programmet ignorere signalet og fortsette å utføre Main () -funksjonstråden. La oss bare raskt lagre og utføre dette programmet for å se utdataene.

#inkludere
#inkludere
#inkludere
int main ()
signal (sigint, sig_ign);
for (int i = 1 ;; i ++)
printf ("%d: ignorerer signalet ... \ n", i);
søvn (5);
retur 0;

Etter denne kodeutførelsen fortsetter den viktigste () -funksjonen PRINTF () -klæringen å utføre selv etter å ha brukt snarveien “Ctrl+C”. Så vi stoppet kraftig programmet på slutten.

Eksempel 02

Hvis du automatisk vil heve et signal for C -programmet ditt uten å bruke CTRL+C -snarveisnøkkelen, kan du gjøre det også ved å bruke REISE () -funksjonen til signalbiblioteket. Derfor har vi oppdatert koden fra det første eksemplet og lagt til en håndtak () -funksjon igjen. Hoved () -funksjonen starter med opprettelsen av et signal ved å bruke signal () -funksjonen ved å gi den et alternativ “SIGUSR1” med “håndtaket” -funksjonen i parametrene. Dette SigusSr1 -alternativet er nøkkelen til å generere et automatisk signal. "For" -sløyfen sover i 10 sekunder etter å ha utført Printf -setningen og kaller deretter Raise () -funksjonen med alternativet SIGUSR1 for å generere et automatisk signal ved å kalle "håndtak" -funksjonen. Det er det; Vi er klare til å utføre dette programmet for nå.

#inkludere
#inkludere
#inkludere
voidhåndtak (int s)
printf ("\ nraise ... \ n");
søvn (5);

int main ()
signal (sigusr1, håndtak);
for (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
søvn (10);
heve (sigusr1);
retur 0;

Etter den vellykkede samlingen finner utførelsen sted. Hoved () tråden GPT utføres, og programmet sover i 10 sekunder mens det er i løkken.

Etter 10 sekunder har Raise -funksjonen blitt påberopt for å generere et automatisk signal ved å kalle håndtakfunksjonen. Utførelsen sover de neste 5 sekundene i håndtakets funksjon.

Kontrollen blir gitt tilbake til Main () -funksjonen "Loop", og denne prosessen fortsetter til du forlater programmet villig ved å bruke CTRL+Z -snarveien.

Akkurat som det automatiske signalet ditt for programmet ditt, kan du også drepe signalet etter at det påkaller og sender signalet til en prosesseringsgruppe. Med andre ord, "Kill" -funksjonen til POSIX C Signals -biblioteket har blitt brukt til å sende varsler til programmets gruppe. Derfor har vi oppdatert hovedprogrammet vårt sammen med håndtakfunksjonen i ovennevnte bildekode. PID_T -objektet brukes til å lage en ID “P” for prosessen. Signal- () -funksjonen kalles her for å lage et signal gjennom bruk av håndtaket () -funksjonen definert før fra hovedfunksjonen.

GetPid () -funksjonen kalles innenfor "for" -sløyfen for å få prosess -ID for denne tråden og lagre den i en variabel “P”. Denne prosess -ID "P" sendes til "Kill" -funksjonen sammen med alternativet SIGUSR1 for å drepe signalet og sende rapporten til en fremdriftsgruppe. Deretter sover et program i 8 sekunder og skriver ut "tilbake i hoved" mens løkken fortsetter.

#inkludere
#inkludere
#inkludere
voidhåndtak (int s)
printf ("\ nstop ... \ n");

int main ()
pid_t p;
signal (sigusr1, håndtak);
for (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
p = getPid ();
Kill (P, Sigusr1);
søvn (8);
printf ("Tilbake i Main \ n");
retur 0;

Funksjonen blir utført, sender signalet til prosessgruppen og sover i 8 sekunder.

"Back in Main" ble henrettet, og sløyfen fortsatte den samme behandlingen.

Konklusjon

Denne guiden har demonstrert bruken av signalfunksjoner i C -programmet for å gjøre arbeidsmiljøet ditt mer effektivt. For dette har vi prøvd POSIXs signal () -funksjon, Kill () -funksjon og Raise () -funksjon sammen med Sigint, Sig_ign og Sigusr1 -alternativene i funksjonene.