C Programmeren

POSIX-signalen met C-programmering

POSIX-signalen met C-programmering
We kunnen een signaal definiëren als een activiteit die wordt geactiveerd om een ​​bewerking of thread te waarschuwen wanneer het tijdstip van aankomst voor een bepaalde significante situatie is. Telkens wanneer een procedure of thread een signaal bevestigt, stopt de procedure of thread wat het ook doet en onderneemt onmiddellijk actie. Bij coördinatie tussen processen kan het signaal effectief zijn. In deze gids bestudeer je signaalhandlers in Linux via de C-taal.

Standaard of reguliere signalen:

Het headerbestand 'signaal'.h' bevat signalen gespecificeerd als een macroconstante. De titel van het sein begon met “SIG” en wordt voorafgegaan door een kort seinoverzicht. Bijgevolg heeft elk signaal een duidelijke numerieke waarde. De programmacode moet de naam van het signaal gebruiken, niet meerdere signalen. De oorzaak hierachter is dat het aantal signalen kan variëren afhankelijk van het systeem, maar de interpretatie van namen is standaard. Hieronder staan ​​enkele reguliere signalen waarvan de functionaliteit is gedefinieerd:.

INSCHRIJVEN:

Dit signaal zal de verwerking ophangen. Het SIGHUP-signaal wordt afgebroken om aan te geven dat de verbinding met de gebruikersterminal is verbroken, waarschijnlijk omdat een externe communicatie wordt verbroken of wordt opgehangen.

SIGINT:

Het zal het proces verstoren. Het SIGINT-signaal wordt ontvangen wanneer de gebruiker de INTR-toets invoert (meestal Ctrl + C).

SIGQUIT:

Het zal de verwerking stoppen of verlaten. Het SIGQUIT-signaal wordt ontvangen wanneer de gebruiker de QUIT-toets invoert (meestal Ctrl + \).

SIGILL:

Het wordt uitgevoerd wanneer een ongeoorloofd commando is gegeven. Het SIGILL-signaal wordt gemaakt wanneer er een poging wordt gedaan om een ​​ongewenste of bevoorrechte opdracht uit te voeren. Wanneer de stapel overloopt en de machine problemen heeft met het uitvoeren van een signaalcontroller, kan SIGILL ook worden gemaakt.

SIGTRAP:

Het wordt aangeroepen wanneer een trace trap-instructie wordt uitgevoerd. Het SIGTRAP-signaal wordt gecreëerd door een breekpuntcommando en een ander trapcommando. De debugger gebruikt zo'n signaal.

SIGABRT:

Het wordt het Abort-signaal genoemd. Het SIGABRT-signaal wordt gemaakt door de methode abort() aan te roepen. Een dergelijk signaal wordt gebruikt om te wijzen op de onnauwkeurigheid die wordt waargenomen door de bovengenoemde code en vastgelegd door de abort()-methodeaanroep.

SIGFPE:

Uitzondering voor drijvende-komma's; Het SIGFPE-signaal wordt geproduceerd wanneer een catastrofale wiskundige fout optreedt.

SIGUSR1 en SIGUSR2:

De SIGUSR1- en SIGUSR2-signalen kunnen worden gebruikt zoals u dat wilt. Het is gunstig voor een gemakkelijke interactie tussen processen om een ​​signaalhandler te maken voor dergelijke signalen in de toepassing die het signaal ontvangt.

Standaardgedrag van signalen:

Er is standaardgedrag of actie per signaal en het is mogelijk om het standaardgedrag aan te passen met behulp van de handlerfunctie. Het automatische SIGKILL- en SIGABRT-signaalgedrag kan niet worden gewijzigd of verwaarloosd.

Termijn: Het zal de operatie beëindigen.

Kern: Er wordt een kerndumpdocument gegenereerd en de bewerking wordt beëindigd.

Ign: Het proces zou een signaal over het hoofd zien.

Hou op: Het zal de operatie stoppen.

vervolg: De operatie wordt niet stopgezet.

Signaalverwerking:

Het proces heeft een voorkeur voor gedrag voor een signaal wanneer het wordt bevestigd. Het proces kan zich als volgt gedragen:

Het signaal wordt automatisch uitgeschakeld wanneer het gedefinieerde signaalgedrag over het hoofd wordt gezien.

Met behulp van methoden zoals signaal of sigactie, kan de code een handlerfunctie registreren. Het wordt het opvangen van een signaal van een handler genoemd.

Als een signaal niet wordt behandeld of verwaarloosd, kan de standaardactie plaatsvinden.

U kunt de functie Signaalverwerking definiëren als:

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

Wanneer de verwerking een signaalsignum verkrijgt, kan de methode signal() de 'func'-methode aanroepen. Signal() keert een aanwijzer terug naar de 'func'-methode als deze welvarend is of als er een uitzondering wordt geretourneerd naar errno en -1 in plaats daarvan.

De 'func'-aanwijzer kan drie waarden hebben:

SIG_DFL: Dit is een verwijzing naar de standaard SIG DFL()-methode, gedefinieerd in de koptekst.h document dat wordt gebruikt voor het verkrijgen van het standaardgedrag van het signaal.

SIG_IGN: Dit is een verwijzing naar de SIG IGN() negeermethode, gespecificeerd in de header.h-document.

Door de gebruiker gedefinieerde handlermethode-aanwijzer: De door de gebruiker gedefinieerde handlermethode van het type void(*)(int), houdt in dat de retourcategorie ongeldig is en dat het enige argument int is.

Maak een nieuw bestand 'signaal' aan.c' en schrijf hieronder de code van de signaalhandler erin.

Koppel het signaal.c-bestand met gcc.

Tijdens het uitvoeren van het signaal.c-bestand, we hebben een eindeloze lus die wordt uitgevoerd in de hoofdmethode. Door op CTRL+C te drukken, startte het de handlermethode en stopte de uitvoering van de hoofdmethode. De verwerking van de belangrijkste methode ging door na de voltooiing van de handler-methode. Als u op Ctrl+\ drukt, stopt de bewerking.

Signaal negeren:

Maak een bestand 'signaal' aan om het signaal over het hoofd te zien.c' en schrijf eronder code in.

Bind het negeren.c-bestand met gcc.

Voer het signaal uit.c bestand. Tik op CTRL+C, het SIGNIT-signaal wordt aangemaakt; desalniettemin wordt het gedrag onopgemerkt omdat de handlermethode wordt opgesomd volgens de SIG_IGN()-methode.

Signaalafhandelaar opnieuw registreren:

Om de signaalhandler opnieuw te registreren, maakt u een nieuw bestand 'rereg'.c' en schrijf de onderstaande code erin:

De herregistratie koppelen.c-bestand met gcc.

Voer de herregistratie uit.c bestand. Bij de eerste keer drukken op CTRL+C werd de handlermethode verhoogd en werd de signaalhandler opnieuw geregistreerd bij SIG_DFL. Terwijl ik nogmaals op CTRL+C drukte, werd de uitvoering beëindigd.

Stuur signalen met Raise():

Maak een bestand 'verzenden'.c' en voeg de onderstaande code toe. Voor het verzenden van signalen naar de aanroepende methode wordt de methode raise() gebruikt.

Relateer de verzending.c-bestand met gcc.

Het proces gebruikt de methode raise() om het SIGUSR1-signaal zelfstandig te verzenden.

Stuur signalen met Kill():

Voeg de onderstaande code toe in 'raise'.c'. Gebruik de kill-methode() om signalen naar de procesgroep te sturen.

Koppel de verhoging.c-bestand met gcc.

Door de methode kill() te gebruiken, stuurt het proces het SIGUSR1-signaal naar het bovengenoemde:.

Ouder-kind interactie:

Schrijf de onderstaande code in een bestand om de interactie tussen ouder en kind te bekijken:.

Bind de communicatie.c-bestand met gcc.

Fork()/ methode genereert kind, zet nul terug naar het onderliggende proces en kind-ID naar ouder.

Conclusie:

In deze handleiding hebben we gezien hoe je het signaal voor interprocesinteractie in Linux kunt maken, verwerken, verzenden, negeren, opnieuw registreren en gebruiken.

Hoe FPS-teller in Linux-games te tonen
Linux-gaming kreeg een grote duw toen Valve in 2012 Linux-ondersteuning voor Steam-client en hun games aankondigde. Sindsdien hebben veel AAA- en indi...
Sid Meier's Civilization VI downloaden en spelen op Linux and
Inleiding tot het spel Civilization 6 is een moderne versie van het klassieke concept dat werd geïntroduceerd in de serie Age of Empires-games. Het id...
Doom installeren en spelen op Linux
Inleiding tot Doom De Doom-serie is ontstaan ​​in de jaren 90 na de release van de originele Doom. Het was meteen een hit en vanaf die tijd heeft de g...