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.