C Programmering

POSIX-signaler med C-programmering

POSIX-signaler med C-programmering
Vi kan definiera en signal som en aktivitet som utlöses för att varna en operation eller tråd när som helst vid ankomst för en viss betydelsefull situation. När en procedur eller tråd bekräftar en signal kommer proceduren eller tråden att stoppa vad den än gör och vidta omedelbara åtgärder. Vid samordning mellan processerna kan signalen vara effektiv. I den här guiden studerar du signalhanterare i Linux genom C-språket.

Standard eller vanliga signaler:

Rubrikfilens signal.h 'har signaler specificerade i den som en makrokonstant. Titeln på signalen började med “SIG” och föregås av en kort signalöversikt. Följaktligen har varje signal ett distinkt numeriskt värde. Programkoden ska använda signalens namn, inte flera signaler. Orsaken bakom det är att antalet signaler kan variera beroende på system, men tolkningen av namnen är standard. Nedan följer några vanliga signaler med funktionalitet definierad.

SIGHUP:

Denna signal kommer att lägga på behandlingen. SIGHUP-signalen kastas av för att indikera att användarterminalen kopplas ifrån, troligtvis på grund av att en fjärrkommunikation är trasig eller läggs på.

SIGINT:

Det kommer att störa processen. SIGINT-signalen tas emot när användaren matar in INTR-tangenten (vanligtvis Ctrl + C).

SIGQUIT:

Det kommer att stoppa eller avsluta behandlingen. SIGQUIT-signalen tas emot när användaren matar in QUIT-tangenten (vanligtvis Ctrl + \).

SIGILL:

Det körs när ett olagligt kommando har gjorts. SIGILL-signalen skapas närhelst ett försök görs för att utföra ett skräp eller privilegierat kommando. När stacken flyter över och maskinen har problem med att köra en signalstyrenhet kan SIGILL också skapas.

SIGTRAP:

Det kallas när någon spårfältsinstruktion körs. SIGTRAP-signalen skapas av ett brytpunktskommando och ett annat fällkommando. Felsökaren använder en sådan signal.

SIGABRT:

Det kallas Abort-signalen. SIGABRT-signalen skapas genom att anropa abort () -metoden. En sådan signal används för att påpeka den felaktighet som observeras av koden ovan och registreras av abort () metodanropet.

SIGFPE:

Undantag för flytande poäng; SIGFPE-signalen produceras när ett katastrofalt matematiskt fel uppstår.

SIGUSR1 och SIGUSR2:

SIGUSR1- och SIGUSR2-signalerna kan användas som du vill. Det är fördelaktigt för enkel interprocessinteraktion att skapa en signalhanterare för sådana signaler i applikationen som får signalen.

Standardbeteende för signaler:

Det finns standardbeteende eller åtgärd per signal och det är möjligt att justera standardbeteendet med hanterarfunktionen. Det automatiska SIGKILL- och SIGABRT-signalbeteendet kunde inte modifieras eller försummas.

Termin: Det kommer att avsluta operationen.

Kärna: Ett kärndumpdokument kommer att genereras och operationen avslutas.

Ign: Processen skulle förbise en signal.

Sluta: Det stoppar operationen.

Fortsättning: Operationen kommer att hållas stoppad.

Signalhantering:

Processen har en preferens för beteende för en signal när den bekräftas. Processen kan fungera som följande:

Signalen avvisas automatiskt när det definierade signalbeteendet förbises.

Med hjälp av metoder som signal eller sigaktion kan koden registrera en hanterarfunktion. Det kallas att fånga en signal från en hanterare.

Om en signal inte behandlas eller försummas kan standardåtgärden inträffa.

Du kan definiera Signalhanteringsfunktionen som:

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

När bearbetningen erhåller ett signumsignal kan signal () -metoden kalla "func" -metoden. Signal () återställer en pekare till "func" -metoden om den är välmående eller ett undantag returneras till errno och -1 istället.

Funktionspekaren kan ha tre värden:

SIG_DFL: Detta är en pekare till standardmetoden SIG DFL (), definierad i rubriken.h-dokument som används för att få signalens standardbeteende.

SIG_IGN: Detta är en hänvisning till SIG IGN () ignoreringsmetoden, som anges i rubriken.h-dokument.

Användardefinierad hanteringsmetodpekare: Den användardefinierade hanteringsmetodtypen void (*) (int), innebär att returkategorin är ogiltig och att det ensamma argumentet är int.

Skapa en ny filsignal.c 'och skriv nedan signalhanterarkoden i den.

Länka signalen.c-fil med gcc.

Medan du kör signalen.c-fil har vi en oändlig slinga som utförs i huvudmetoden. När du trycker på CTRL + C startade hanteringsmetoden och huvudmetodkörningen stoppades. Den huvudsakliga metodbearbetningen fortsatte efter genomförandet av hanterarmetoden. När du trycker på Ctrl + \ avslutas operationen.

Signal Ignorera:

Skapa en filsignal för att se över signalen.c 'och skriv underkoden i den.

Bind ignorera.c-fil med gcc.

Kör signalen.c-fil. Tryck CTRL + C, SIGNIT-signalen skapas; ändå är beteendet obemärkt eftersom hanteringsmetoden räknas till SIG_IGN () -metoden.

Omregistrera signalhanteraren:

För att omregistrera signalhanteraren, skapa en ny fil 'omregistrera.c 'och skriv in koden nedan i den:

Associera omregistret.c-fil med gcc.

Kör omregistreringen.c-fil. När du trycker på CTRL + C-hanteringsmetoden första gången upp, och signalhanteraren registreras om till SIG_DFL. Medan du trycker på CTRL + C igen avslutades körningen.

Skicka signaler med Raise ():

Skapa en fil 'skicka.c 'och lägg till nedanstående kod. För att skicka signaler till anropsmetoden används höjningsmetoden ().

Relatera skicka.c-fil med gcc.

Processen använder höjningsmetoden () för att sända SIGUSR1-signalen på egen hand.

Skicka signaler med Kill ():

Lägg till koden nedan i 'höjning'.c '. Använd kill-metoden () för att skicka signaler till processgruppen.

Länka höjningen.c-fil med gcc.

Genom att använda kill () -metoden riktar processen SIGUSR1-signalen till det ovan nämnda.

Förälder-barn-interaktion:

För att titta på interaktion mellan förälder och barn, skriv koden nedan i en fil.

Obligera komm.c-fil med gcc.

Gaffel () / metod genererar barn, återställ noll till barnprocessen och barn-ID till förälder.

Slutsats:

I den här guiden har vi sett hur man skapar, hanterar, skickar, ignorerar, omregistrerar och använder signalen för interprocessinteraktion i Linux.

Battle for Wesnoth Tutorial
Slaget om Wesnoth är ett av de mest populära open source-strategispel som du kan spela just nu. Det här spelet har inte bara utvecklats under mycket l...
0 A.D. Handledning
Av de många strategispelen där ute, 0 A.D. lyckas framstå som en omfattande titel och ett mycket djupt, taktiskt spel trots att det är öppen källkod. ...
Unity3D självstudie
Introduktion till Unity 3D Unity 3D är en kraftfull spelutvecklingsmotor. Det är tvärplattform som gör att du kan skapa spel för mobil, webb, skrivbor...