C Programování

Signály POSIX s programováním C

Signály POSIX s programováním C
Můžeme definovat signál jako aktivitu, která je spuštěna, aby upozornila operaci nebo vlákno kdykoli v době příjezdu na určitou významnou situaci. Kdykoli procedura nebo podproces potvrdí signál, procedura nebo podproces se zastaví, ať už dělá cokoli, a provede okamžitou akci. Při meziprocesové koordinaci může být signál efektivní. V této příručce budete studovat obsluhy signálů v systému Linux prostřednictvím jazyka C.

Standardní nebo pravidelné signály:

Signál hlavičkového souboru.h 'má v něm specifikované signály jako makro konstantu. Název signálu začínal písmenem „SIG“ a předchází mu krátký přehled signálu. Jakýkoli signál má tedy odlišnou číselnou hodnotu. Programový kód by měl používat název signálu, ne několik signálů. Důvodem je to, že počet signálů se může lišit v závislosti na systému, ale interpretace jmen je standardní. Níže uvádíme několik pravidelných signálů s definovanou funkcí.

ZOBRAZENÍ:

Tento signál ukončí zpracování. Signál SIGHUP je odesílán, aby indikoval disociaci uživatelského terminálu, pravděpodobně kvůli přerušení nebo zavěšení vzdálené komunikace.

SIGINT:

Naruší to proces. Signál SIGINT je přijímán vždy, když uživatel zadá klíč INTR (obvykle Ctrl + C).

SIGQUIT:

Zastaví nebo ukončí zpracování. Signál SIGQUIT je přijímán vždy, když uživatel zadá klávesu QUIT (obvykle Ctrl + \).

SIGILL:

Spustí se, když byl vydán nedovolený příkaz. Signál SIGILL se vytváří vždy, když je vyvíjeno úsilí k provedení nevyžádaného nebo privilegovaného příkazu. Kdykoli přeteče zásobník a stroj má problémy s provozem signálového řadiče, může být také vytvořen SIGILL.

SIGTRAP:

Volá se, když je prováděna nějaká instrukce trasovací pasti. Signál SIGTRAP je vytvářen příkazem breakpoint a jiným příkazem trap. Debugger takový signál používá.

SIGABRT:

Říká se tomu Přerušit signál. Signál SIGABRT je vytvořen voláním metody abort (). Takový signál se používá k poukázání na nepřesnosti pozorované výše uvedeným kódem a zaznamenané voláním metody abort ().

SIGFPE:

Výjimka pro plovoucí desetinné čárky; Signál SIGFPE se vytváří, když dojde ke katastrofické matematické chybě.

SIGUSR1 a SIGUSR2:

Signály SIGUSR1 a SIGUSR2 lze použít tak, jak chcete. Pro snadnou interakci mezi procesy je výhodné vytvořit obslužný program pro takové signály v aplikaci, která signál získává.

Výchozí chování signálů:

Pro každý signál existuje standardní chování nebo akce a je možné upravit výchozí chování pomocí funkce obslužné rutiny. Chování automatického signálu SIGKILL a SIGABRT nebylo možné upravit nebo zanedbat.

Období: Ukončí to operaci.

Jádro: Bude vygenerován dokument s výpisem jádra a operace bude ukončena.

Ign: Tento proces by přehlédl signál.

Stop: Zastaví to operaci.

Pokračování: Zastavení operace bude trvalé.

Zpracování signálu:

Proces má preference chování pro signál, když je potvrzen. Proces se může chovat jako následující:

Signál je automaticky odmítnut, když je definované chování signálu přehlédnuto.

Pomocí metod, jako je signál nebo sigaction, může kód zaregistrovat funkci obslužné rutiny. Říká se tomu chytání signálu od obsluhy.

Pokud signál není zpracováván nebo zanedbáván, může dojít k standardní akci.

Funkci zpracování signálu můžete definovat jako:

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

Když zpracování získá signální signum, může metoda signal () volat metodu 'func'. Signal () vrátí ukazatel na metodu 'func', pokud je prosperující nebo je místo toho vrácena výjimka errno a -1.

Ukazatel „func“ může mít tři hodnoty:

SIG_DFL: Toto je ukazatel na standardní metodu SIG DFL () definovanou v záhlaví.h dokument používaný pro získání standardního chování signálu.

SIG_IGN: Toto je odkaz na metodu ignorování SIG IGN () uvedenou v záhlaví.h dokument.

Ukazatel metody obslužné rutiny definované uživatelem: Uživatelská metoda typu obslužné rutiny void (*) (int), znamená, že návratová kategorie je neplatná a že solitární argument je int.

Vytvořte signál nového souboru.c 'a zapište do něj kód obslužné rutiny signálu.

Propojte signál.c soubor s gcc.

Při běhu signálu.Soubor c, máme nekonečnou smyčku prováděnou v hlavní metodě. Po stisknutí kombinace kláves CTRL + C spustila metodu obslužné rutiny a provádění hlavní metody se zastavilo. Zpracování hlavní metody pokračovalo po dokončení metody obslužné rutiny. Po stisknutí Ctrl + \ se operace ukončí.

Ignorovat signál:

Pro přehlédnutí signálu vytvořte souborový signál.c 'a zapište pod něj kód.

Kravatu ignorujte.c soubor s gcc.

Spusťte signál.soubor c. Klepněte na CTRL + C, vytvoří se signál SIGNIT; chování je nicméně bez povšimnutí, protože metoda obslužné rutiny je vyčíslena na metodu SIG_IGN ().

Znovu zaregistrovat zpracovatel signálu:

Chcete-li znovu zaregistrovat obslužnou rutinu signálu, vytvořte nový soubor 'rereg.c 'a vložte do něj níže uvedený kód:

Přiřadit registraci.c soubor s gcc.

Spusťte znovu.soubor c. Při prvním stisknutí CTRL + C byla vyvolána metoda obslužné rutiny a obslužná rutina signálu byla znovu zaregistrována do SIG_DFL. Při dalším stisknutí CTRL + C bylo spuštění ukončeno.

Odesílání signálů pomocí funkce Raise ():

Vytvořte soubor 'odeslat.c 'a přidejte níže uvedený kód. Pro odesílání signálů do volající metody se používá metoda raise ().

Vztahujte odeslání.c soubor s gcc.

Proces využívá metodu raise () k vlastnímu přenosu signálu SIGUSR1.

Posílejte signály pomocí Kill ():

Přidejte následující kód do 'raise.C'. Pomocí metody kill () odešlete signály do skupiny procesů.

Propojte navýšení.c soubor s gcc.

Použitím metody kill () proces směruje signál SIGUSR1 na výše uvedené.

Interakce rodič-dítě:

Chcete-li sledovat interakci rodič-dítě, zapište níže uvedený kód do souboru.

Spojte komunikaci.c soubor s gcc.

Fork () / method generuje podřízené, vrátí nulu podřízenému procesu a podřízené ID nadřazenému.

Závěr:

V této příručce jsme viděli, jak vytvořit, zpracovat, odeslat, ignorovat, znovu zaregistrovat a použít signál pro meziprocesovou interakci v Linuxu.

Hry Nejlepší hry z příkazového řádku pro Linux
Nejlepší hry z příkazového řádku pro Linux
Příkazový řádek není při používání Linuxu jen vaším největším spojencem - může být také zdrojem zábavy, protože jej můžete použít k hraní mnoha zábavn...
Hry Nejlepší aplikace pro mapování gamepadu pro Linux
Nejlepší aplikace pro mapování gamepadu pro Linux
Pokud rádi hrajete hry na Linuxu s gamepadem místo typického vstupního systému pro klávesnici a myš, máte k dispozici několik užitečných aplikací. Mno...
Hry Užitečné nástroje pro hráče Linuxu
Užitečné nástroje pro hráče Linuxu
Pokud rádi hrajete hry na Linuxu, je pravděpodobné, že jste ke zlepšení herního zážitku použili aplikace a nástroje jako Wine, Lutris a OBS Studio. Kr...