“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.
#inkludereNå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.
#inkludereEtter 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å.
#inkludereEtter 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.
#inkludereFunksjonen 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.