Mechanizmy časovača vám umožňujú naplánovať jadro OS, aby upozornilo aplikáciu, keď uplynie vopred určený čas. Zvyčajne ich použijete tak, že poskytnete dve informácie. Najprv musíte určiť, koľko času má časovač trvať, kým na to upozorníte. Po druhé, budete musieť pripraviť funkciu spätného volania, ktorá zareaguje, keď sa objaví toto upozornenie.

Tradičný prístup k časovačom

Mechanizmy časovačov v systémoch založených na Linuxe a Unixe sa vyvinuli, aby slúžili rôznym potrebám. Rôzne prístupy vám môžu pomôcť vyriešiť rôzne typy problémov. Často však uvidíte prvú verziu alarm() mechanizmus sa stále používa.

Funkcia budíka je najjednoduchší spôsob použitia časovača; tu je jeho prototyp:

nepodpísanéintalarm(nepodpísanéint sekundy);

Pomocou tejto metódy môžete určiť čas iba v celých sekundách. Po uplynutí času operačný systém odošle súbor SIGALRM signál pre vašu aplikáciu. Na spracovanie uplynutia platnosti časovača vo vašej aplikácii by ste mali definovať aj funkciu spätného volania.

Tu je príklad funkcie obsluhy signálu:

instagram viewer
#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú

neplatnétimer_callback(int signum)
{
čas_t teraz = čas(NULOVÝ);
printf("Signál %d zachytený na %li", signum, teraz);
}

inthlavné()
{
signál (SIGALRM, timer_callback);
alarm (1);
spať (3);
vrátiť0;
}

Tento kód vyvoláva a SIGALRM signál po 1 druhý. Ak chcete predĺžiť oneskorenie časovača na päť sekúnd, stačí zavolať alarm (5) namiesto toho. Ak chcete zastaviť časovač, zadajte hodnotu 0: budík (0).

Po uplynutí času sa časovač, ktorý používate, nebude pravidelne reštartovať. Napríklad, ak chcete odložiť o ďalšiu sekundu, mali by ste reštartovať mechanizmus ďalším volaním na alarm().

Napriek jednoduchosti použitia má táto metóda niekoľko nevýhod:

  • Iba jeden časovač naraz.
  • Žiadna podpora pravidelných časovačov.
  • Časový úsek môžete zadať iba v násobkoch celých sekúnd.
  • Žiadny spôsob, ako zistiť, koľko času zostáva na časovači.

Uložte vzorový kód uvedený vyššie ako alarm.c. Kedy skompilujete a spustíte to, program zavolá timer_callback fungovať po jednej sekunde. Potom bude čakať zvyšné dve sekundy z dôvodu spať (3) riadok, potom ukončite.

$ gcc -o alarm alarm.c
$ čas ./budík
Signál 14 zachytený na čísle 1653490465
skutočných 0m1,004s
užívateľ 0m0,000s
sys 0m0,003s

Dôvodom použitia príkazu time je vidieť časy. Ale ak sa pozriete na výsledok, celkový čas behu nie sú tri sekundy. Je to spôsobené tým SIGALRM signál z alarm (1) keď uplynie prvá sekunda, zatiaľ čo syscall spôsobené spustenou funkciou spánku (3). Keď príde tento signál, preruší systémové volanie spustené pre spánok (3).

Použitie intervalového časovača

Mechanizmus intervalového časovača bol prvýkrát dostupný vo verzii 4.2 BSD. Bolo to neskôr štandardizované POSIXom. Jeho hlavné výhody oproti tradičným alarm() metóda založená na časovači je:

  • Poskytuje mikrosekundové rozlíšenie.
  • Umožňuje detailnejšie ovládať meranie času v troch rôznych režimoch.
  • Je možné ho nastaviť raz a spustiť ho pravidelne.
  • V každom okamihu je možné zistiť, ako dlho je prítomný.

Funkčné prototypy používané na operácie intervalového časovača sú nasledovné:

#zahŕňajú

intnastavovač(int ktorý, konšt struct itimerval *newValue, struct itimerval *oldValue);
intgettimer(int ktorý, struct itimerval *hodnota);

štrukturovaťitimerval
{
štrukturovaťčasovýitInterval;// ďalšia hodnota
štrukturovaťčasovýitValue;// súčasná hodnota
};

štrukturovaťčasový
{
dlhý tv_sec;
dlhý tv_usec;
};

Ak chcete nastaviť intervalový časovač, budete musieť použiť itimerval štrukturovať. Budete musieť odovzdať hodnotu pomocou tejto štruktúry ako druhého argumentu do nastavovač funkciu.

Napríklad intervalový časovač, ktorý upozorní vašu aplikáciu na 1 sekundu a potom každých 300 milisekúnd, je možné nastaviť takto:

štrukturovaťitimervalnewTimer;
štrukturovaťitimervaloldTimer;

newTimer.itValue.tv_sec = 1;
newTimer.itValue.tv_usec = 0;

newTimer.itInterval.tv_sec = 0;
newTimer.itInterval.tv_usec = 300 * 1000;

setitimer (ITIMER_REAL, &newTimer, &oldTimer);

Ak je pred nastavením nových hodnôt aktívny intervalový časovač, jeho hodnoty sa prenesú do premennej adresy itimerval typ daný tretiemu parametru funkcie.

Pomocou mechanizmu intervalového časovača môžete nastaviť tri rôzne typy časovačov. Zadajte typ časovača v prvom parametri setitimer():

Typ časovača Signál Vysvetlenie
ITIMER_REAL SIGALRM Nezávisle od času stráveného aplikáciou, vypočítaného z celkového uplynutého času.
ITIMER_VIRTUAL SIGVTALRM Vypočítané za čas, keď je aplikácia spustená iba v používateľskom režime.
ITIMER_PROF SIGPROF Vypočítané ako súčet času stráveného aplikáciou v používateľskom aj systémovom režime.

Z tejto tabuľky môžete vidieť, že ITIMER_REAL typ posiela a SIGALRM signál, rovnako ako alarm() funkciu.

Pomocou intervalového časovača a alarm() v rovnakej aplikácii bude mätúce. Aj keď môžete vykonať druhú kontrolu zostávajúceho času pomocou gettimer(), nemá zmysel používať ich súčasne.

Tu je príklad definovania funkcie obsluhy signálu pomocou hlavička ladenia:

#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú
#zahŕňajú "./debug.h"

neplatnétimer_callback(int signum)
{
štrukturovaťčasovýteraz;
gettimeofday(&teraz, NULOVÝ);
printf("Signál %d zachytený na %li.%03li ", signum, now.tv_sec, now.tv_usec / 1000);
}

inthlavné()
{
nepodpísanéint zostávajúce = 3;

štrukturovaťitimervalnew_timer;
štrukturovaťitimervalold_timer;

new_timer.it_value.tv_sec = 1;
new_timer.it_value.tv_usec = 0;
new_timer.it_interval.tv_sec = 0;
new_timer.it_interval.tv_usec = 300 * 1000;

settimer (ITIMER_REAL, &new_timer, &old_timer);
signál (SIGALRM, timer_callback);

zatiaľ čo (spať (zostávajúci) != 0)
{
ak (chyba == EINTR)
debugf("spánok prerušený signálom");
inak
errorf("chyba spánku %s", strerror (errno));
}

vrátiť0;
}

Vyššie uvedený kód používa spánok () počkajte tri sekundy. Počas tejto doby beží intervalový časovač, najskôr jednu sekundu a potom v intervale 300 milisekúnd.

Pre lepšie pochopenie uložte a skompilujte vzorový kód s názvom interval.c:

$ gcc -o interval interval.c
$ čas ./interval
Signál 14 zachytený na čísle 1653493614.325
ladenie: spánok prerušený signálom (hlavný interval.c: 36)
Signál 14 zachytený na čísle 1653493614.625
ladenie: spánok prerušený signálom (hlavný interval.c: 36)
Signál 14 zachytený na čísle 1653493614.925
ladenie: spánok prerušený signálom (hlavný interval.c: 36)
Signál 14 zachytený na 1653493615.225
ladenie: spánok prerušený signálom (hlavný interval.c: 36)
Signál 14 zachytený na čísle 1653493615.525
...

Ako môžete vidieť z výstupu po spustení časovača, volá funkciu spätného volania každých 300 milisekúnd.

Po chvíli čakania si však všimnete, že aplikácia sa neukončí. Naďalej spúšťa funkciu spätného volania každých 300 milisekúnd. Ak zvýšite hodnotu intervalu v milisekundách, uvidíte, že aplikácia sa ukončí. Je to kvôli oblasti použitia spánok () funkciu.

Význam používania časovačov v systéme Linux

Najmä pre aplikácie v reálnom čase má mechanizmus časovača veľký význam. Toto je tiež riešenie používané na optimalizáciu výkonu. Môžete ho dokonca použiť na meranie dostupnosti alebo latencie vo vašej aplikácii. Na sledovanie uplynutého času a udalostí časového prechodu je dôležité používať mechanizmy časovača.

Ako skompilovať a nainštalovať softvér zo zdroja v systéme Linux

Prečítajte si ďalej

zdieľamTweetujtezdieľamEmail

Súvisiace témy

  • Programovanie
  • Programovanie
  • Tipy pre Linux

O autorovi

Fatih Küçükkarakurt (10 publikovaných článkov)

Inžinier a vývojár softvéru, ktorý je fanúšikom matematiky a technológií. Vždy mal rád počítače, matematiku a fyziku. Vyvinul projekty herných motorov, ako aj strojové učenie, umelé neurónové siete a knižnice lineárnej algebry. Okrem toho pokračuje v práci na strojovom učení a lineárnych matriciach.

Viac od Fatiha Küçükkarakurta

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné e-knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber