Syntaks
usignert int alarm (usignert int sekunder)Funksjonen er definert i unistd.h topptekstfil.
Argumenter
Funksjonen tar ett argument, sekunder. Etter sekunder sekunder har gått siden vi ba om alarm() funksjon, SIGALRM signalet genereres. Standard oppførsel ved mottak av SIGALRM er å avslutte prosessen. Men vi kan fange og håndtere signalet. Se detaljer om signalhåndtering.
De alarm() -funksjonen vil returnere en verdi som ikke er null, hvis en annen alarm tidligere er innstilt og verdien er antall sekunder igjen for forrige planlagte alarm på grunn av levert. Ellers alarm() vil returnere null.
Eksempel 1.c:
#inkludere#inkludere
#inkludere
ugyldig sig_handler (int signum)
printf ("Inside handler function \ n");
int main ()
signal (SIGALRM, sig_handler); // Registrer signalbehandler
alarm (2); // Planlagt alarm etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("% d: Inne i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund
retur 0;
På skjermbildet av utdataene fra Eksempel 1.c, programmet kjøres ved hjelp av tidskommando, slik at vi kan få en oversikt over gjennomføringstiden for programmet. Vi observerte at i hovedfunksjon kaller vi alarm() funksjon, planlagt i 2 sekunder. Så for loop utføres, etter 2 sekunder kalles sig_handler-funksjon og utførelsen av hovedfunksjonen er satt på pause. Etter utførelse av sig_handler-funksjonen gjenopptas hovedfunksjonen for looputførelse. Her bruker vi søvnfunksjon for å forsinke slik at vi kan forstå flyten av utførelsen. For-sløyfen er en uendelig sløyfe, når vi trykker på en avbruddstast (Ctrl + C), vil utførelsen stoppe.
Genererer SIGALRM ved hjelp av signal() funksjonen kan ikke stables. Bare en SIGALRM generasjon kan planlegges. Suksessive samtaler av signal() funksjon tilbakestille vekkerklokken til anropsprosessen.
Eksempel 2.c:
#inkludere#inkludere
#inkludere
ugyldig sig_handler (int signum)
printf ("Inside handler function \ n");
int main ()
signal (SIGALRM, sig_handler); // Registrer signalbehandler
alarm (4); // Planlagt alarm etter 4 sekunder
alarm (1); // Planlagt alarm etter 1 sekund
for (int i = 1 ;; i ++)
printf ("% d: Inne i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund
retur 0;
I skjermbildet av utdataene fra Eksempel 2.c, vi kan se at programmet ble utført i mer enn 7 sekunder, men den første alarmen som var planlagt etter 4 sekunder, ringer ikke behandlerfunksjonen. Den andre alarmen som var planlagt etter 1 sekund, tilbakestiller alarmen.
Hvis verdien av argumentets sekunder er null, kanselleres alle tidligere utførte alarmanmodninger.
Eksempel 3.c:
#inkludere#inkludere
#inkludere
ugyldig sig_handler (int signum)
printf ("Inside handler function \ n");
int main ()
signal (SIGALRM, sig_handler); // Registrer signalbehandler
alarm (2); // Planlagt alarm etter 2 sekunder
alarm (0); // Avbrutt forrige alarm
for (int i = 1 ;; i ++)
printf ("% d: Inne i hovedfunksjonen \ n", i);
søvn (1); // Forsink i 1 sekund
retur 0;
I skjermbildet av utdataene fra Eksempel 3.c, vi kan se at den første alarmen som ble planlagt etter 2 sekunder er kansellert på grunn av den andre alarmen i 0 sekund.
I Eksempel 4.c vi vil se hvor kontinuerlig vi kan stille en alarm hvert 2. sekund.
Eksempel 4.c:
#inkludere#inkludere
#inkludere
ugyldig sig_handler (int signum)
printf ("Inside handler function \ n");
alarm (2); // Planlegg en ny alarm etter 2 sekunder
int main ()
signal (SIGALRM, sig_handler); // Registrer signalbehandler
alarm (2); // Planlegg den første alarmen etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("% d: Inne i hovedfunksjonen \ n", i);
pause(); // venter til signalet blir håndtert
retur 0;
På skjermbildet av utdataene fra Eksempel 4.c, vi kan se at alarmen er kontinuerlig hvert 2. sekund. Vi tilbakestiller alarmen i sig_handler-funksjonen.
I Eksempel 5.c vi vil se hvordan vi kan forsinke alarmen som allerede er planlagt. Vi bruker SIGINT-signal for avbrudd. Når brukeren skriver Ctrl + C på tastaturet, SIGINT signalet vil generere.
Eksempel 5.c:
#inkludere#inkludere
#inkludere
ugyldig sig_handler (int signum)
if (signum == SIGALRM) // signalbehandler for SIGALRM
printf ("Inside handler function for SIGALRM \ n");
alarm (2);
if (signum == SIGINT) // signalbehandler for SIGINT
printf ("\ nSlukker i 5 sekunder ... \ n");
alarm (5);
int main ()
signal (SIGALRM, sig_handler); // Registrer signalbehandler for SIGALRM
signal (SIGINT, sig_handler); // Registrer signalbehandler for SIGINT
alarm (2); // Planlegg den første alarmen etter 2 sekunder
for (int i = 1 ;; i ++)
printf ("% d: Inne i hovedfunksjonen \ n", i);
pause(); // venter til signalet blir håndtert
retur 0;
I skjermbildet av utdataene fra Eksempel 5.c, vi kan se at når brukertypen Ctrl + C tilbakestilles alarmen 5 sekunder. I dette programmet har vi bare brukt en behandlerfunksjon for to forskjellige signaler, men i behandlerfunksjonen er det sjekket at for hvilket signal håndteringsfunksjonen blir kalt.
Konklusjon:
Så vi har sett at hvordan alarmfunksjonen kan stilles inn for å utløse signal, hvordan du tilbakestiller alarm, hvordan du avbryter allerede planlagt alarm.