C Programmēšana

Kā lietot SIGALRM un trauksmes funkciju C valodā?

Kā lietot SIGALRM un trauksmes funkciju C valodā?
The trauksme () funkcija tiek izmantota, lai ģenerētu a SIGALRM signālu pēc noteikta laika. Šajā rakstā mēs parādīsim, kā to izmantot trauksme () funkcija un SIGALRM signāls Linux. Tātad, sāksim darbu.

Sintakse

neparakstīta int trauksme (neparakstīta int sekundes)

Funkcija ir definēta unistd.h galvenes fails.

Argumenti

Funkcijai nepieciešams viens arguments, sekundes. Pēc sekundes ir pagājušas sekundes kopš pieprasījuma trauksme() funkcija, SIGALRM tiek ģenerēts signāls. Noklusējuma darbība, saņemot SIGALRM ir izbeigt procesu. Bet mēs varam uztvert signālu un tikt galā ar to. Skatiet informāciju par signālu apstrādi.

The trauksme () funkcija atgriezīs vērtību, kas nav nulle, ja iepriekš ir iestatīts cits trauksmes signāls un tā vērtība ir sekundes, kas atlikušas iepriekšējam ieplānotajam trauksmei piegādes dēļ. Citādi trauksme () atgriezīs nulli.

1. piemērs.c:

# iekļaut
# iekļaut
# iekļaut
 
void sig_handler (int signum)
 
printf ("Iekšējā apdarinātāja funkcija \ n");

 
int main ()
 
signāls (SIGALRM, sig_handler); // Reģistrēt signālu apstrādātāju
 
trauksme (2); // Plānotā trauksme pēc 2 sekundēm
 
par (int i = 1 ;; i ++)
 
printf ("% d: iekšpusē galvenā funkcija \ n", i);
gulēt (1); // Kavēšanās uz 1 sekundi

atgriešanās 0;

Ekrānuzņēmumā 1. piemērs.c, programma tiek palaista, izmantojot komandu Time, lai mēs varētu gūt pārskatu par programmas izpildes laiku. Mēs novērojām, ka galvenajā funkcijā mēs saucam trauksme () funkcija, ieplānota 2 sekundes. Tātad, ja cilpa tiek izpildīta, pēc 2 sekundēm tiek izsaukta sig_handler funkcija un galvenās funkcijas izpilde ir apturēta. Pēc sig_handler funkcijas izpildes tiek atjaunota galvenā funkcija cilpas izpildei. Šeit mēs izmantojam miega funkciju aizkavēšanai, lai mēs varētu saprast izpildes plūsmu. For cilpa ir bezgalīga cilpa, nospiežot pārtraukšanas taustiņu (Ctrl + C), izpilde tiks pārtraukta.

Ģenerē SIGALRM izmantojot signāls () funkciju nevar sakraut. Tikai viens SIGALRM var ieplānot paaudzi. Secīgi zvani no signāls () funkcija atiestatīs zvana procesa modinātāju.

2. piemērs.c:

# iekļaut
# iekļaut
# iekļaut
 
void sig_handler (int signum)
 
printf ("Iekšējā apdarinātāja funkcija \ n");

 
int main ()
 
signāls (SIGALRM, sig_handler); // Reģistrēt signālu apstrādātāju
 
trauksme (4); // Plānotā trauksme pēc 4 sekundēm
trauksme (1); // Plānotā trauksme pēc 1 sekundes
 
par (int i = 1 ;; i ++)
 
printf ("% d: iekšpusē galvenā funkcija \ n", i);
gulēt (1); // Kavēšanās uz 1 sekundi

 
atgriešanās 0;

Ekrānuzņēmumā 2. piemērs.c, mēs varam redzēt, ka programma izpildīja vairāk nekā 7 sekundes, bet pirmais trauksme, kas bija ieplānota pēc 4 sekundēm, neizsauc apstrādātāja funkciju. Otrais trauksme, kas bija ieplānota pēc 1 sekundes, trauksmi atiestata.

Ja argumenta sekundes vērtība ir nulle, visi iepriekš veiktie trauksmes pieprasījumi tiek atcelti.

3. piemērs.c:

# iekļaut
# iekļaut
# iekļaut
 
void sig_handler (int signum)
 
printf ("Iekšējā apdarinātāja funkcija \ n");

 
int main ()
 
signāls (SIGALRM, sig_handler); // Reģistrēt signālu apstrādātāju
 
trauksme (2); // Plānotā trauksme pēc 2 sekundēm
trauksme (0); // Atcēla iepriekšējo trauksmi
 
par (int i = 1 ;; i ++)
 
printf ("% d: iekšpusē galvenā funkcija \ n", i);
gulēt (1); // Kavēšanās uz 1 sekundi

 
atgriešanās 0;

Ekrānuzņēmumā 3. piemērs.c, mēs varam redzēt, ka pirmais trauksme, kas bija ieplānota pēc 2 sekundēm, tiek atcelta otrās trauksmes dēļ uz 0 sekundēm.

In 4. piemērs.c mēs redzēsim, cik nepārtraukti mēs varam iestatīt modinātāju ik pēc 2 sekundēm.

4. piemērs.c:

# iekļaut
# iekļaut
# iekļaut
 
void sig_handler (int signum)
 
printf ("Iekšējā apdarinātāja funkcija \ n");
 
trauksme (2); // Pēc 2 sekundēm ieplānojiet jaunu trauksmi

 
int main ()
 
signāls (SIGALRM, sig_handler); // Reģistrēt signālu apstrādātāju
 
trauksme (2); Ieplānojiet pirmo trauksmi pēc 2 sekundēm
 
par (int i = 1 ;; i ++)
 
printf ("% d: iekšpusē galvenā funkcija \ n", i);
pauze (); // gaida, kamēr tiks apstrādāts signāls

 
atgriešanās 0;

Ekrānuzņēmumā 4. piemērs.c, mēs varam redzēt, ka trauksme ir nepārtraukta ik pēc 2 sekundēm. Mēs atiestatām trauksmi funkcijā sig_handler.

In 5. piemērs.c mēs redzēsim, kā mēs varam aizkavēt jau ieplānoto trauksmi. Pārtraukšanai izmantosim SIGINT signālu. Kad lietotājs tastatūrā ievada Ctrl + C, PARAKSTS ģenerēs signālu.

5. piemērs.c:

# iekļaut
# iekļaut
# iekļaut
 
void sig_handler (int signum)
 
if (signum == SIGALRM) // signālu apstrādātājs SIGALRM
 
printf ("Iekšējā apstrādātāja funkcija SIGALRM \ n");
trauksme (2);

if (signum == SIGINT) // signāla apstrādātājs SIGINT
printf ("\ nAtlikšana uz 5 sekundēm ... \ n");
trauksme (5);

 

 
int main ()
 
signāls (SIGALRM, sig_handler); // Reģistrējiet signālu apstrādātāju SIGALRM
signāls (SIGINT, sig_handler); // Reģistrējiet signālu apstrādātāju SIGINT
 
trauksme (2); Ieplānojiet pirmo trauksmi pēc 2 sekundēm
 
par (int i = 1 ;; i ++)
 
printf ("% d: iekšpusē galvenā funkcija \ n", i);
pauze (); // gaida, kamēr tiks apstrādāts signāls

 
atgriešanās 0;

Ekrānuzņēmumā 5. piemērs.c, mēs varam redzēt, ka, ievadot lietotāju Ctrl + C, trauksme tiek atiestatīta 5 sekundes. Šajā programmā mēs esam izmantojuši tikai vienu apdarinātāja funkciju diviem dažādiem signāliem, bet apstrādātāja funkcijā ir pārbaudīts, kuram signālam tiek izsaukta apdarinātāja funkcija.

Secinājums:

Tātad, mēs esam redzējuši, kā signāla iedarbināšanai var iestatīt trauksmes funkciju, kā atiestatīt trauksmi, kā atcelt jau ieplānoto trauksmi.

Kā palielināt FPS Linux?
FPS apzīmē Kadri sekundē. FPS uzdevums ir izmērīt kadru ātrumu video atskaņošanā vai spēļu izrādēs. Vienkāršos vārdos nepārtrauktu pilnekrāna attēlu s...
Populārākās Oculus App Lab spēles
Ja esat Oculus austiņu īpašnieks, jums ir jāsazinās par sānu ielādi. Sānu ielāde ir process, kurā austiņās tiek instalēts saturs, kas nav veikals. Sid...
10 labākās spēles, kuras spēlēt Ubuntu
Windows platforma ir bijusi viena no dominējošajām spēļu platformām, jo ​​mūsdienās tiek attīstīts milzīgs spēļu skaits, lai atbalstītu Windows. Vai k...