C Програмиране

POSIX сигнали с програмиране на C

POSIX сигнали с програмиране на C
Можем да определим сигнал като дейност, която се задейства, за да предупреди операция или нишка, когато времето на пристигане за определена значителна ситуация. Всеки път, когато процедура или нишка разпознаят сигнал, процедурата или нишката ще спрат каквото и да правят и ще предприемат незабавни действия. При координацията между процесите сигналът може да бъде ефективен. В това ръководство ще изучавате обработчиците на сигнали в Linux чрез езика C.

Стандартни или редовни сигнали:

Сигналът на заглавния файл.h 'има сигнали, посочени в него като макроконстанта. Заглавието на сигнала започва с „SIG“ и се предшества от кратък преглед на сигнала. Следователно всеки сигнал има различна цифрова стойност. Кодът на програмата трябва да използва името на сигнала, а не няколко сигнала. Причината за това е, че броят на сигналите може да варира в зависимост от системата, но тълкуването на имената е стандартно. По-долу са дадени някои редовни сигнали с дефинирана функционалност.

ВДИХАНЕ:

Този сигнал ще прекрати обработката. Сигналът SIGHUP се изхвърля, за да покаже прекратяване на връзката на потребителския терминал, вероятно поради прекъсване или затваряне на дистанционна комуникация.

ЗНАК:

Това ще наруши процеса. Сигналът SIGINT се получава всеки път, когато потребителят въведе клавиша INTR (обикновено Ctrl + C).

SIGQUIT:

Това ще спре или излезе от обработката. Сигналът SIGQUIT се получава всеки път, когато потребителят въведе бутона QUIT (обикновено Ctrl + \).

SIGILL:

Изпълнява се, когато е направена незаконна команда. Сигналът SIGILL се създава, когато се полагат усилия за изпълнение на боклуци или привилегирована команда. Винаги, когато стекът прелее и машината има проблеми с пускането на контролер за сигнал, може да бъде създаден и SIGILL.

SIGTRAP:

Извиква се, когато се изпълнява някаква инструкция за улавяне на проследяване. Сигналът SIGTRAP се създава чрез команда за точка на прекъсване и друга команда за улавяне. Дебъгерът използва такъв сигнал.

SIGABRT:

Той се нарича сигнал за прекъсване. Сигналът SIGABRT се създава чрез извикване на метода abort (). Такъв сигнал се използва, за да посочи неточността, наблюдавана от гореспоменатия код и записана чрез извикване на метода abort ().

SIGFPE:

Изключение за плаващи точки; Сигналът SIGFPE се генерира, когато възникне катастрофална математическа грешка.

SIGUSR1 и SIGUSR2:

Сигналите SIGUSR1 и SIGUSR2 могат да бъдат използвани както искате. Изгодно е за лесното междупроцесно взаимодействие да се създаде обработващ сигнал за такива сигнали в приложението, което получава сигнала.

Поведение по подразбиране на сигналите:

Има стандартно поведение или действие за всеки сигнал и е възможно да се коригира поведението по подразбиране с помощта на функцията манипулатор. Поведението на автоматичните сигнали SIGKILL и SIGABRT не може да бъде променено или пренебрегнато.

Срок: Това ще прекрати операцията.

Ядро: Ще бъде генериран основен дъмп документ и операцията ще бъде прекратена.

Ign: Процесът би пропуснал сигнал.

Спри се: Това ще спре операцията.

Напред: Операцията няма да бъде спряна.

Обработка на сигнала:

Процесът има предпочитание за поведение за сигнал, когато е потвърден. Процесът може да се държи по следния начин:

Сигналът се отхвърля автоматично, когато се пренебрегне определеното поведение на сигнала.

Използвайки методи като сигнал или измерване, кодът може да регистрира манипулаторна функция. Нарича се улавяне на сигнал от манипулатор.

Ако даден сигнал не се третира или пренебрегва, може да възникне стандартното действие.

Можете да определите функцията за обработка на сигнала като:

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

Когато обработката получи сигнален знак, методът signal () може да извика метода 'func'. Signal () връща показалеца към метода 'func', ако е проспериращ или вместо това се връща изключение към errno и -1.

Показалецът "func" може да има три стойности:

SIG_DFL: Това е указател към стандартния метод SIG DFL (), дефиниран в заглавката.h документ, използван за получаване на стандартното поведение на сигнала.

SIG_IGN: Това е препратка към метода за игнориране SIG IGN (), посочен в заглавката.h документ.

Потребителски дефиниран указател на метод на манипулатор: Дефинираният от потребителя метод на манипулатор void (*) (int), предполага, че връщаната категория е void и че единичен аргумент е int.

Създайте нов файл 'сигнал.c 'и напишете отдолу код за обработка на сигнала в него.

Свържете сигнала.c файл с gcc.

Докато пускате сигнала.c файл, имаме безкраен цикъл, който се извършва в основния метод. При натискане на CTRL + C той стартира метода на манипулатора и изпълнението на основния метод спира. Обработката на основния метод продължи след изпълнението на метода манипулатор. След натискане на Ctrl + \, операцията се прекратява.

Игнориране на сигнала:

За пренебрегване на сигнала създайте файл „сигнал“.c 'и напишете отдолу код в него.

Завържете игнора.c файл с gcc.

Пуснете сигнала.c файл. Докоснете CTRL + C, създава се сигнал SIGNIT; въпреки това поведението е незабелязано, защото методът на манипулатора се изброява на метод SIG_IGN ().

Пререгистрирайте манипулатора на сигнала:

За да регистрирате повторно манипулатора на сигнал, създайте нов файл „пререгистрирайте“.c 'и впишете в него следния код:

Свържете пререгистрирането.c файл с gcc.

Стартирайте пререгистрирането.c файл. Докато за първи път натискате CTRL + C методът на манипулатора се повдига и манипулаторът на сигнала се регистрира отново в SIG_DFL. Докато натискате CTRL + C отново, изпълнението беше прекратено.

Изпращайте сигнали с помощта на Raise ():

Създайте файл 'изпрати.c 'и добавете кода по-долу. За изпращане на сигнали до извикващия метод се използва методът рейз ().

Свържете изпращането.c файл с gcc.

Процесът използва метода рейз (), за да предаде сигнала SIGUSR1 самостоятелно.

Изпращане на сигнали с помощта на Kill ():

Добавете кода по-долу в 'рейз.° С'. Използвайте метода kill (), за да изпращате сигнали към групата процеси.

Свържете рейза.c файл с gcc.

Използвайки метода kill (), процесът насочва сигнала SIGUSR1 към гореспоменатия.

Взаимодействие между родител и дете:

За да гледате взаимодействието родител-дете, напишете кода по-долу във файл.

Обвържете кому.c файл с gcc.

Fork () / метод генерира дете, връща нула към дъщерния процес и идентификатор на дете към родител.

Заключение:

В това ръководство видяхме как да създадем, обработим, изпратим, игнорираме, пререгистрираме и използваме сигнала за взаимодействие между процесите в Linux.

Как да промените левия и десния бутон на мишката на компютър с Windows 10
Напълно нормално е всички устройства на компютърни мишки да са ергономично проектирани за десничари. Но има налични устройства за мишка, които са спец...
Емулирайте кликванията на мишката, като задържите курсора на мишката с кликаща мишка в Windows 10
Използването на мишка или клавиатура в неправилна поза при прекомерна употреба може да доведе до много здравословни проблеми, включително напрежение, ...
Добавете жестове на мишката към Windows 10, като използвате тези безплатни инструменти
През последните години компютрите и операционните системи значително се развиха. Имаше време, когато потребителите трябваше да използват команди за на...