Programare C

Semnale POSIX cu programare C

Semnale POSIX cu programare C
Putem defini un semnal ca o activitate care este declanșată pentru a alerta o operațiune sau un thread ori de câte ori este momentul sosirii pentru o anumită situație semnificativă. Ori de câte ori o procedură sau un thread recunoaște un semnal, procedura sau thread-ul va opri orice face și va lua măsuri imediate. În coordonarea inter-proces, semnalul poate fi eficient. În acest ghid, veți studia gestionarea semnalelor în Linux prin limbajul C.

Semnale standard sau regulate:

Semnalul fișierului antet.h 'are semnale specificate în ea ca o constantă macro. Titlul semnalului a început cu „SIG” și este precedat de o scurtă prezentare a semnalului. În consecință, orice semnal are o valoare numerică distinctă. Codul programului ar trebui să utilizeze numele semnalului, nu mai multe semnale. Cauza din spatele acestuia este că numărul de semnale poate varia în funcție de sistem, dar interpretarea numelor este standard. Mai jos sunt câteva semnale regulate cu funcționalitatea lor definită.

PREZENTARE:

Acest semnal va închide procesarea. Semnalul SIGHUP este eliminat pentru a indica disocierea terminalului utilizatorului, probabil din cauza unei comunicări la distanță rupte sau închise.

SIGINT:

Va perturba procesul. Semnalul SIGINT este primit ori de câte ori utilizatorul introduce tasta INTR (de obicei Ctrl + C).

SIGQUIT:

Acesta va opri sau va ieși din procesare. Semnalul SIGQUIT este primit ori de câte ori utilizatorul introduce tasta QUIT (de obicei Ctrl + \).

SIGILL:

Se execută când a fost făcută o comandă ilicită. Semnalul SIGILL este creat ori de câte ori se face un efort pentru a efectua o comandă nedorită sau privilegiată. Ori de câte ori stiva se revarsă și mașina are probleme cu rularea unui controler de semnal, poate fi creat și SIGILL.

SIGTRAP:

Se numește atunci când se execută unele instrucțiuni de captare a urmelor. Semnalul SIGTRAP este creat de o comandă de punct de întrerupere și o altă comandă de captare. Depanatorul folosește un astfel de semnal.

SIGABRT:

Se numește semnal de întrerupere. Semnalul SIGABRT este creat prin apelarea metodei abort (). Un astfel de semnal este folosit pentru a evidenția inexactitatea observată de codul menționat anterior și înregistrat prin apelul metodei abort ().

SIGFPE:

Excepție pentru virgulă mobilă; Semnalul SIGFPE este produs atunci când apare o eroare matematică catastrofală.

SIGUSR1 și SIGUSR2:

Semnalele SIGUSR1 și SIGUSR2 ar putea fi utilizate așa cum doriți. Este benefic pentru interacțiunea ușoară între procese să creezi un handler de semnal pentru astfel de semnale în aplicația care primește semnalul.

Comportamentul implicit al semnalelor:

Există un comportament sau acțiune standard pentru fiecare semnal și este posibil să reglați comportamentul implicit utilizând funcția de gestionare. Comportamentul automat al semnalului SIGKILL și SIGABRT nu a putut fi modificat sau neglijat.

Termen: Se va încheia operațiunea.

Nucleu: Va fi generat un document de memorie de bază și operațiunea va fi încheiată.

Ign: Procesul ar trece cu vederea un semnal.

Stop: Va opri operațiunea.

Cont: Operațiunea va fi susținută pentru a fi oprită.

Manipularea semnalului:

Procesul are o preferință de comportament pentru un semnal atunci când este recunoscut. Procesul se poate comporta după cum urmează:

Semnalul este respins automat atunci când comportamentul de semnal definit este trecut cu vederea.

Folosind metode precum semnal sau sigaction, codul poate înregistra o funcție de gestionare. Se numește captarea unui semnal de la un handler.

Dacă un semnal nu este tratat sau neglijat, poate apărea acțiunea standard.

Puteți defini funcția de gestionare a semnalului ca:

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

Când procesarea obține un semn de semnal, metoda signal () poate apela metoda „func”. Signal () readuce un pointer la metoda „func” dacă este prosperă sau dacă o excepție revine la errno și -1.

Pointerul „func” este capabil să aibă trei valori:

SIG_DFL: Acesta este un indicator către metoda standard SIG DFL (), definită în antet.h document utilizat pentru obținerea comportamentului standard al semnalului.

SIG_IGN: Aceasta este o referință la metoda de ignorare SIG IGN (), specificată în antet.h document.

Pointer metoda de gestionare definită de utilizator: Metoda de manipulare definită de utilizator tip void (*) (int), implică faptul că categoria returnată este nulă și că argumentul solitar este int.

Creați un semnal de fișier nou.c 'și scrieți mai jos codul de gestionare a semnalului.

Conectați semnalul.fișier c cu gcc.

În timpul rulării semnalului.c fișier, avem o buclă nesfârșită care se desfășoară în metoda principală. La apăsarea CTRL + C, a pornit metoda handler și executarea metodei principale s-a oprit. Prelucrarea metodei principale a continuat după realizarea metodei handler. La apăsarea Ctrl + \, operația se oprește.

Ignorare semnal:

Pentru a trece cu vederea semnalul, creați un semnal de fișier.c 'și scrieți sub cod în el.

Legați ignoranța.fișier c cu gcc.

Rulați semnalul.fișier c. Atingeți CTRL + C, se creează semnalul SIGNIT; cu toate acestea, comportamentul este neobservat deoarece metoda handler este enumerată la metoda SIG_IGN ().

Înregistrați gestionarul de semnal:

Pentru a înregistra din nou dispozitivul de gestionare a semnalului, creați un nou fișier 'rereg.c 'și înscrieți codul de mai jos în acesta:

Asociați regiunea.fișier c cu gcc.

Rulați reglajul.fișier c. La prima apăsare a metodei CTRL + C handler ridicat, iar handler-ul semnalului s-a re-înregistrat la SIG_DFL. În timp ce apăsați din nou CTRL + C, executarea a fost încheiată.

Trimiteți semnale utilizând Raise ():

Creați un fișier 'trimiteți.c 'și adăugați codul de mai jos. Pentru trimiterea semnalelor către metoda de apelare, se folosește metoda raise ().

Corelați trimiterea.fișier c cu gcc.

Procesul utilizează metoda raise () pentru a transmite singur semnalul SIGUSR1.

Trimiteți semnale folosind Kill ():

Adăugați codul de mai jos în 'raise.c '. Utilizați metoda kill () pentru a trimite semnale către grupul de proces.

Legați mărirea.fișier c cu gcc.

Prin utilizarea metodei kill (), procesul direcționează semnalul SIGUSR1 către cele menționate anterior.

Interacțiunea părinte-copil:

Pentru a urmări interacțiunea părinte-copil, scrieți codul de mai jos într-un fișier.

Legați com.fișier c cu gcc.

Fork () / metoda generează copil, readuce zero la procesul copil și ID copil la părinte.

Concluzie:

În acest ghid, am văzut cum să creăm, să gestionăm, să trimitem, să ignorăm, să ne înregistrăm din nou și să folosim semnalul pentru interacțiunea inter-proces în Linux.

Jocuri HD remasterizate pentru Linux care nu au avut niciodată lansare Linux mai devreme
Mulți dezvoltatori și editori de jocuri vin cu remasterizarea HD a jocurilor vechi pentru a prelungi durata de viață a francizei, vă rog fanilor să so...
Cum se utilizează AutoKey pentru automatizarea jocurilor Linux
AutoKey este un utilitar de automatizare desktop pentru Linux și X11, programat în Python 3, GTK și Qt. Folosind funcțiile sale de scriptare și MACRO,...
Cum se arată FPS Counter în jocurile Linux
Jocurile cu Linux au primit un impuls major când Valve a anunțat suportul Linux pentru clientul Steam și jocurile acestora în 2012. De atunci, multe j...