C Ohjelmointi

POSIX-signaalit C-ohjelmoinnilla

POSIX-signaalit C-ohjelmoinnilla
Voimme määritellä signaalin toiminnaksi, joka laukaistaan ​​hälyttämään operaatio tai säie aina saapumisajankohtana tiettyyn merkittävään tilanteeseen. Aina kun menettely tai säie kuittaa signaalin, menettely tai säie pysähtyy mitä tahansa tekemässä ja ryhtyy välittömästi toimiin. Prosessien välisessä koordinoinnissa signaali voi olla tehokas. Tässä oppaassa tutkitaan signaalinkäsittelijöitä Linuxissa C-kielen kautta.

Vakio- tai säännölliset signaalit:

Otsikkotiedoston signaali.h ': n signaalit on määritetty makrovakiona. Signaalin otsikko alkoi kirjaimella “SIG”, ja sitä edeltää lyhyt signaalin yleiskatsaus. Näin ollen kaikilla signaaleilla on erillinen numeerinen arvo. Ohjelmakoodissa tulisi käyttää signaalin nimeä, ei useita signaaleja. Syynä on se, että signaalien määrä voi vaihdella järjestelmästä riippuen, mutta nimien tulkinta on vakio. Alla on joitain säännöllisiä signaaleja, joiden toiminnallisuus on määritelty.

NÄYTTÖ:

Tämä signaali keskeyttää käsittelyn. SIGHUP-signaali lähetetään pois päätelaitteiden irtisanomisesta, mikä johtuu todennäköisesti etäyhteyden rikkoutumisesta tai katkaisemisesta.

MERKINTA:

Se häiritsee prosessia. SIGINT-signaali vastaanotetaan aina, kun käyttäjä syöttää INTR-näppäimen (yleensä Ctrl + C).

SIGQUIT:

Se pysäyttää tai lopettaa käsittelyn. SIGQUIT-signaali vastaanotetaan aina, kun käyttäjä syöttää QUIT-näppäimen (yleensä Ctrl + \).

SIGILL:

Se toimii, kun laiton komento on annettu. SIGILL-signaali luodaan aina, kun yritetään suorittaa roskaa tai etuoikeutettua komentoa. Aina kun pino täyttyy ja koneella on ongelmia signaaliohjaimen käyttämisessä, voidaan luoda myös SIGILL.

SIGTRAP:

Sitä kutsutaan, kun jokin jäljitysloukku-komento suoritetaan. SIGTRAP-signaali luodaan katkaisupistekomennolla ja uudella ansakomennolla. Virheenkorjaaja käyttää tällaista signaalia.

SIGABRT:

Sitä kutsutaan Keskeytä-signaaliksi. SIGABRT-signaali luodaan kutsumalla abort () -menetelmä. Tällaista signaalia käytetään osoittamaan edellä mainitun ja keskeytetyn () -menetelmän kutsun havaitseman koodin havaitsema epätarkkuus.

OHJE:

Poikkeus kelluville pisteille; SIGFPE-signaali syntyy, kun tapahtuu katastrofaalinen matemaattinen virhe.

SIGUSR1 ja SIGUSR2:

SIGUSR1- ja SIGUSR2-signaaleja voidaan käyttää haluamallasi tavalla. Prosessinvälisen vuorovaikutuksen kannalta on hyödyllistä luoda signaalinkäsittelijä tällaisille signaaleille sovellukseen, joka vastaanottaa signaalin.

Signaalien oletuskäyttäytyminen:

Jokaista signaalia kohden on vakiokäyttäytyminen tai -toiminta, ja oletuskäyttäytymistä on mahdollista säätää ohjaintoiminnon avulla. Automaattista SIGKILL- ja SIGABRT-signaalikäyttäytymistä ei voitu muuttaa tai jättää huomiotta.

Termi: Se lopettaa toiminnan.

Ydin: Ydindokumentti luodaan ja toiminta lopetetaan.

Ign: Prosessi unohtaa signaalin.

Lopettaa: Se keskeyttää toiminnan.

Jatkuu: Operaatiota jatketaan keskeyttämästä.

Signaalinkäsittely:

Prosessilla on etusija käyttäytymiselle signaalille, kun se kuitataan. Prosessi voi toimia seuraavasti:

Signaali hylätään automaattisesti, kun määritetty signaalin käyttäytyminen jätetään huomiotta.

Käyttämällä menetelmiä, kuten signaali tai merkintä, koodi voi rekisteröidä käsittelijän toiminnon. Sitä kutsutaan signaalin saamiseksi käsittelijältä.

Jos signaalia ei käsitellä tai se jätetään laiminlyötyksi, voi tapahtua vakiotoiminto.

Voit määrittää signaalinkäsittelytoiminnon seuraavasti:

$ Int-signaali () int signum, void (* funk) (int))

Kun prosessointi saa signaalisignaalin, signaali () -menetelmä voi kutsua funktiomenetelmää. Signal () palauttaa osoittimen funktiomenetelmään, jos se on menestyvä tai jos poikkeus palautetaan virheeseen ja -1 sen sijaan.

Func-osoittimella voi olla kolme arvoa:

SIG_DFL: Tämä on osoitin otsikossa määriteltyyn vakiomenetelmään SIG DFL ().h asiakirja, jota käytetään signaalin vakiokäyttäytymisen saamiseen.

SIG_IGN: Tämä on viite otsikossa määritettyyn SIG IGN () -ohitusmenetelmään.h asiakirja.

Käyttäjän määrittelemä käsittelijämenetelmän osoitin: Käyttäjän määrittelemä käsittelijämenetelmän tyyppi void (*) (int) tarkoittaa, että palautusluokka on mitätön ja että yksinäinen argumentti on int.

Luo uusi tiedosto -signaali.c 'ja kirjoita siihen signaalinkäsittelijän koodi.

Liitä signaali.c-tiedosto gcc: llä.

Suoritettaessa signaalia.c-tiedosto, meillä on loputon silmukka, joka suoritetaan päämenetelmällä. Kun painat CTRL + C, se aloitti käsittelijämenetelmän, ja päämenetelmän toteutus pysähtyi. Päämenetelmän käsittely jatkui käsittelijämenetelmän toteuttamisen jälkeen. Kun painat Ctrl + \, toiminto lopetetaan.

Signaali ohittaa:

Luo tiedostosignaali, jotta voit jättää signaalin huomiotta.c 'ja kirjoita siihen koodi.

Sido huomiotta.c-tiedosto gcc: llä.

Suorita signaali.c-tiedosto. Napauta CTRL + C, SIGNIT-signaali luodaan; käyttäytyminen on kuitenkin huomaamaton, koska käsittelijä-menetelmä lasketaan SIG_IGN () -menetelmäksi.

Rekisteröi signaalinkäsittelijä uudelleen:

Rekisteröi signaalinkäsittelijä uudelleen luomalla uusi tiedosto 'rereg.c 'ja kirjoita siihen seuraava koodi:

Liitä regeg.c-tiedosto gcc: llä.

Suorita rereg.c-tiedosto. Kun ensimmäistä kertaa painat CTRL + C-käsittelijämenetelmää, se nousi ja signaalinkäsittelijä rekisteröitiin uudelleen SIG_DFL: ään. Kun painat CTRL + C uudelleen, suoritus lopetettiin.

Lähetä signaaleja korotuksella ():

Luo tiedosto Lähetä.c 'ja lisää alla oleva koodi. Signaalien lähettämiseen kutsumenetelmälle käytetään korotus () -menetelmää.

Liitä lähetys.c-tiedosto gcc: llä.

Prosessi käyttää korotusmenetelmää () SIGUSR1-signaalin lähettämiseen yksinään.

Lähetä signaaleja tappamalla ():

Lisää alla oleva koodi korotukseen.c '. Käytä tappomenetelmää () lähettääksesi signaaleja prosessiryhmälle.

Yhdistä korotus.c-tiedosto gcc: llä.

Kill () -menetelmää käyttämällä prosessi ohjaa SIGUSR1-signaalin edellä mainittuun.

Vanhempien ja lasten vuorovaikutus:

Voit katsella vanhempien ja lasten välistä vuorovaikutusta kirjoittamalla alla olevan koodin tiedostoon.

Liitä komm.c-tiedosto gcc: llä.

Haarukka () / menetelmä luo lapsen, palauttaa nollan lapsiprosessiin ja lapsen tunnuksen vanhemmalle.

Päätelmä:

Tässä oppaassa olemme nähneet kuinka luoda, käsitellä, lähettää, ohittaa, rekisteröidä uudelleen ja käyttää signaalia prosessien väliseen vuorovaikutukseen Linuxissa.

Best Linux Distros for Gaming in 2021
The Linux operating system has come a long way from its original, simple, server-based look. This OS has immensely improved in recent years and has no...
Kuinka siepata ja suoratoistaa pelisessiosi Linuxissa
Aikaisemmin pelaamista pidettiin vain harrastuksena, mutta ajan myötä pelialalla tapahtui valtava kasvu tekniikan ja pelaajien määrän suhteen. Peliala...
Parhaat pelit, joita voi seurata käsien seurannalla
Oculus Quest esitteli äskettäin loistavan ajatuksen seurannasta ilman ohjaimia. Yhä kasvavan määrän pelejä ja aktiviteetteja, jotka tukevat tukea joko...