Mechanismy časovače vám umožňují naplánovat jádro operačního systému tak, aby upozornilo aplikaci, když uplyne předem stanovený čas. Obvykle je použijete tak, že poskytnete dvě informace. Nejprve budete muset určit, jak dlouho má časovač trvat, než vás upozorní. Zadruhé, budete muset připravit funkci zpětného volání, která zareaguje, když dojde k tomuto oznámení.

Tradiční přístup k časovačům

Mechanismy časovače v systémech založených na Linuxu a Unixu se vyvinuly, aby sloužily různým potřebám. Různé přístupy vám mohou pomoci vyřešit různé typy problémů. Často však uvidíte první verzi poplach() mechanismus stále v provozu.

Funkce budíku je nejjednodušší způsob použití časovače; tady je jeho prototyp:

nepodepsanýintpoplach(nepodepsanýint sekundy);

Pomocí této metody můžete zadat čas pouze v celých sekundách. Když čas vyprší, operační systém odešle SIGALRM signál do vaší aplikace. Chcete-li zpracovat vypršení platnosti časovače ve vaší aplikaci, měli byste také definovat funkci zpětného volání.

instagram viewer

Zde je příklad funkce zpracování signálu:

#zahrnout
#zahrnout
#zahrnout
#zahrnout

prázdnotatimer_callback(int signum)
{
time_t teď = čas(NULA);
printf("Signál %d zachycen na %li", signum, nyní);
}

inthlavní()
{
signál (SIGALRM, timer_callback);
poplach(1);
spát(3);
vrátit se0;
}

Tento kód vyvolává a SIGALRM signál po 1 druhý. Pokud chcete zvýšit zpoždění časovače na pět sekund, stačí zavolat alarm (5) namísto. Chcete-li časovač zastavit, předejte hodnotu 0: alarm (0).

Po uplynutí času se časovač, který používáte, nebude pravidelně restartovat. Chcete-li například zpoždění o další sekundu, měli byste mechanismus restartovat dalším voláním na poplach().

Navzdory snadnému použití má tato metoda některé nevýhody:

  • Pouze jeden časovač najednou.
  • Žádná podpora periodického časovače.
  • Časový úsek můžete zadat pouze v násobcích celých sekund.
  • Žádný způsob, jak zjistit, kolik času zbývá na časovači.

Uložte ukázkový kód uvedený výše jako alarm.c. Když zkompilujete a spustíte to, program zavolá timer_callback funkce po jedné sekundě. Poté bude čekat zbývající dvě sekundy kvůli spát (3) řádek, pak ukončete.

$ gcc -o alarm alarm.c
$ čas ./alarm
Signál 14 zachycen na čísle 1653490465
skutečných 0m1,004s
uživatel 0m0.000s
sys 0m0,003s

Důvodem pro použití příkazu time je možnost vidět časy. Když se ale podíváte na výsledek, celkový čas běhu nejsou tři sekundy. To je způsobeno tím SIGALRM signál z alarm (1) když uplyne první sekunda, zatímco systémové volání způsobená spuštěnou funkcí spánku (3). Když tento signál dorazí, přeruší systémové volání iniciované pro spát (3).

Použití intervalového časovače

Mechanismus intervalového časovače byl poprvé dostupný ve verzi 4.2 BSD. Bylo to později standardizované POSIXem. Jeho hlavní výhody oproti tradičnímu poplach() metoda založená na časovači je:

  • Poskytuje mikrosekundové rozlišení.
  • Umožňuje podrobnější ovládání měření času ve třech různých režimech.
  • Je možné jej nastavit jednorázově a zprovoznit periodicky.
  • V každém okamžiku je možné zjistit, jak dlouho je přítomen.

Funkční prototypy používané pro operace intervalového časovače jsou následující:

#zahrnout

intnastavovač(int který, konst struct itimerval *newValue, struct itimerval *oldValue);
intgettimer(int který, struct itimerval *hodnota);

strukturovatitimerval
{
strukturovatčasovýitInterval;// další hodnota
strukturovatčasovýitValue;// současná cena
};

strukturovatčasový
{
dlouho tv_sec;
dlouho tv_usec;
};

Pokud chcete nastavit intervalový časovač, budete muset použít itimerval strukturovat. Budete muset předat hodnotu pomocí této struktury jako druhého argumentu do nastavovač funkce.

Například intervalový časovač, který vaši aplikaci upozorní na 1 sekundu a poté každých 300 milisekund, lze nastavit následovně:

strukturovatitimervalnewTimer;
strukturovatitimervaloldTimer;

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);

Pokud je před nastavením nových hodnot aktivní intervalový časovač, jeho hodnoty se přenesou na proměnnou adresu itimerval typ daný třetímu parametru funkce.

Pomocí mechanismu intervalového časovače můžete nastavit tři různé typy časovačů. Zadejte typ časovače v prvním parametru setitimer():

Typ časovače Signál Vysvětlení
ITIMER_REAL SIGALRM Nezávisle na době strávené aplikací, počítáno z celkového uplynulého času.
ITIMER_VIRTUAL SIGVTALRM Počítá se za dobu, kdy aplikace běží pouze v uživatelském režimu.
ITIMER_PROF SIGPROF Vypočítáno jako součet času stráveného aplikací v uživatelském i systémovém režimu.

Z této tabulky můžete vidět, že ITIMER_REAL typ odešle a SIGALRM signál, stejně jako poplach() funkce.

Pomocí intervalového časovače a poplach() ve stejné aplikaci bude matoucí. I když můžete provést druhou kontrolu zbývajícího času pomocí gettimer(), nemá smysl je používat současně.

Zde je příklad definování funkce zpracování signálu pomocí ladicí záhlaví:

#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout "./debug.h"

prázdnotatimer_callback(int signum)
{
strukturovatčasovýNyní;
gettimeofday(&nyní, NULA);
printf("Signál %d zachycen na %li.%03li ", signum, now.tv_sec, now.tv_usec / 1000);
}

inthlavní()
{
nepodepsanýint zbývající = 3;

strukturovatitimervalnový_časovač;
strukturovatitimervalold_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;

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

zatímco (spát (zbývající) != 0)
{
-li (errno == EINTR)
debugf("spánek přerušen signálem");
jiný
errorf("chyba spánku %s", strerror (errno));
}

vrátit se0;
}

Výše uvedený kód používá spát() funkce počkat tři sekundy. Během této doby běží intervalový časovač, nejprve po dobu jedné sekundy a poté v intervalu 300 milisekund.

Pro lepší pochopení uložte a zkompilujte ukázkový kód s názvem interval.c:

$ gcc -o interval interval.c
$ čas ./interval
Signál 14 zachycen na 1653493614.325
ladění: spánek přerušen signálem (hlavní interval.c: 36)
Signál 14 zachycen na 1653493614.625
ladění: spánek přerušen signálem (hlavní interval.c: 36)
Signál 14 zachycen na 1653493614.925
ladění: spánek přerušen signálem (hlavní interval.c: 36)
Signál 14 zachycen na 1653493615.225
ladění: spánek přerušen signálem (hlavní interval.c: 36)
Signál 14 zachycen na 1653493615.525
...

Jak můžete vidět z výstupu po spuštění časovače, volá funkci zpětného volání každých 300 milisekund.

Po chvíli čekání si však všimnete, že se aplikace neukončí. Pokračuje ve spuštění funkce zpětného volání každých 300 milisekund. Pokud zvýšíte hodnotu intervalu v milisekundách, uvidíte, že se aplikace ukončí. Je to kvůli oblasti použití spát() funkce.

Význam používání časovačů v Linuxu

Zejména pro aplikace v reálném čase má mechanismus časovače velký význam. Toto je také řešení používané pro optimalizaci výkonu. Můžete jej dokonce použít k měření doby provozuschopnosti nebo latence ve vaší aplikaci. Je důležité používat mechanismy časovače ke sledování uplynulého času a událostí časového přechodu.

Jak zkompilovat a nainstalovat software ze zdroje v Linuxu

Přečtěte si další

PodíltweetPodílE-mailem

Související témata

  • Programování
  • Programování
  • Tipy pro Linux

O autorovi

Fatih Küçükkarakurt (10 zveřejněných článků)

Inženýr a vývojář softwaru, který je fanouškem matematiky a technologií. Vždy měl rád počítače, matematiku a fyziku. Vyvinul projekty herních enginů a také strojové učení, umělé neuronové sítě a knihovny lineární algebry. Navíc pokračuje v práci na strojovém učení a lineárních maticích.

Více od Fatiha Küçükkarakurta

Přihlaste se k odběru našeho newsletteru

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné e-knihy a exkluzivní nabídky!

Chcete-li se přihlásit k odběru, klikněte sem