Taimera mehānismi ļauj ieplānot OS kodolu, lai tas paziņotu lietojumprogrammai, kad ir pagājis iepriekš noteikts laiks. Parasti tos izmantosit, sniedzot divas informācijas daļas. Pirmkārt, jums būs jānorāda, cik ilgs laiks taimerim ir nepieciešams pirms paziņošanas. Otrkārt, jums ir jāsagatavo atzvanīšanas funkcija, kas darbotos, kad tiek parādīts šis paziņojums.

Tradicionālā pieeja taimeriem

Taimera mehānismi Linux un Unix sistēmās ir attīstījušies, lai apmierinātu dažādas vajadzības. Dažādas pieejas var palīdzēt atrisināt dažāda veida problēmas. Tomēr jūs bieži redzēsit pirmo versiju modinātājs () mehānisms joprojām tiek izmantots.

Modinātāja funkcija ir vienkāršākais taimera lietošanas veids; šeit ir tā prototips:

neparakstītsstarptmodinātājs(neparakstītsstarpt sekundes);

Izmantojot šo metodi, laiku var norādīt tikai veselās sekundēs. Kad laiks ir beidzies, operētājsistēma nosūta SIGALRM signāls jūsu lietojumprogrammai. Lai savā lietojumprogrammā apstrādātu taimera derīguma termiņu, jums ir jādefinē arī atzvanīšanas funkcija.

instagram viewer

Šeit ir signāla apstrādātāja funkcijas piemērs:

#ietver
#ietver
#ietver
#ietver

nederīgstimer_callback(starpt signum)
{
laiks_t tagad = laiks (NULL);
printf("Signāls %d noķerts uz %li", signum, tagad);
}

starptgalvenais()
{
signāls (SIGALRM, timer_callback);
modinātājs (1);
Gulēt(3);
atgriezties0;
}

Šis kods rada a SIGALRM signāls pēc 1 otrais. Ja vēlaties palielināt taimera aizkavi līdz piecām sekundēm, vienkārši zvaniet modinātājs (5) vietā. Lai apturētu taimeri, nododiet vērtību 0: modinātājs (0).

Kad laiks ir beidzies, izmantotais taimeris periodiski netiks restartēts. Piemēram, ja vēlaties atlikt vēl vienu sekundi, jums vajadzētu restartēt mehānismu ar citu zvanu uz modinātājs ().

Neskatoties uz lietošanas vienkāršību, šai metodei ir daži trūkumi:

  • Vienlaicīgi tikai viens taimeris.
  • Nav periodiska taimera atbalsta.
  • Laika periodu var norādīt tikai veselu sekunžu reizēs.
  • Nevar zināt, cik daudz laika ir atlicis taimerī.

Saglabājiet iepriekš norādīto parauga kodu kā signalizācija.c. Kad jūs apkopojat un palaižat to programma izsauks timer_callback funkcija pēc vienas sekundes. Pēc tam tas gaidīs atlikušās divas sekundes, jo gulēt (3) līniju, pēc tam pārtrauciet.

$ gcc -o trauksmes signalizācija.c
$ laiks ./trauksme
14. signāls noķerts uz 1653490465
reāls 0m1.004s
lietotājs 0m0.000s
sys 0m0.003s

Laika komandas izmantošanas iemesls ir iespēja redzēt laikus. Bet, ja paskatās uz rezultātu, tad kopējais darbības laiks nav trīs sekundes. Tas ir saistīts ar SIGALRM signāls no modinātājs (1) kad ir beigusies pirmā sekunde, kamēr syscall ko izraisa miega (3) funkcijas darbība. Kad šis signāls pienāk, tas pārtrauc syscall, kas uzsākta gulēt (3).

Intervāla taimera izmantošana

Intervālu taimera mehānisms pirmo reizi bija pieejams 4.2 BSD versijā. Tas bija vēlāk standartizēts ar POSIX. Tās galvenās priekšrocības salīdzinājumā ar tradicionālo modinātājs () balstīta taimera metode ir:

  • Nodrošina mikrosekundes izšķirtspēju.
  • Tas ļauj detalizētāk kontrolēt laika mērīšanu trīs dažādos režīmos.
  • Ir iespējams to iestatīt vienreiz un likt tam darboties periodiski.
  • Jebkurā brīdī ir iespējams uzzināt, cik ilgi tas atrodas.

Funkciju prototipi, ko izmanto intervāla taimera darbībām, ir šādi:

#ietver

starptiestatītājs(starpt kas, konst struct itimerval *newValue, struct itimerval *oldValue);
starptgetitimer(starpt kas, struct itimerval *value);

struktūraitimerval
{
struktūralaikaitIntervāls;// nākamā vērtība
struktūralaikaitValue;// Šī brīža vērtība
};

struktūralaika
{
garš tv_sec;
garš tv_usec;
};

Ja vēlaties iestatīt intervāla taimeri, jums būs jāizmanto itimerval struktūra. Jums būs jānodod vērtība, izmantojot šo struktūru kā otro argumentu iestatītājs funkcija.

Piemēram, intervāla taimeri, kas paziņos jūsu lietojumprogrammai 1 sekundi un pēc tam ik pēc 300 milisekundēm, var iestatīt šādi:

struktūraitimervaljauns taimeris;
struktūraitimervalvecais taimeris;

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

Ja pirms jauno vērtību iestatīšanas ir aktīvs intervāla taimeris, tā vērtības tiek pārsūtītas uz mainīgo adresi itimerval funkcijas trešajam parametram piešķirtais tips.

Izmantojot intervāla taimera mehānismu, varat iestatīt trīs dažādu veidu taimerus. Norādiet taimera veidu pirmajā parametrā setitimer ():

Taimera veids Signāls Paskaidrojums
ITIMER_REAL SIGALRM Neatkarīgi no lietojumprogrammai patērētā laika, kas aprēķināts no kopējā pagājušā laika.
ITIMER_VIRTUAL SIGVTALRM Aprēķināts laikā, kad lietojumprogramma darbojas tikai lietotāja režīmā.
ITIMER_PROF SIGPROF Aprēķināts no laika summas, ko lietojumprogramma pavadījusi gan lietotāja, gan sistēmas režīmā.

No šīs tabulas var redzēt, ka ITIMER_REAL tips nosūta a SIGALRM signāls, tāpat kā modinātājs () funkcija.

Izmantojot intervāla taimeri un modinātājs () tajā pašā pieteikumā būs mulsinoši. Lai gan jūs varat veikt otro pārbaudi par atlikušo laiku ar gettimer (), nav jēgas tos lietot vienlaicīgi.

Šeit ir piemērs signāla apstrādātāja funkcijas definēšanai ar atkļūdošanas galvene:

#ietver
#ietver
#ietver
#ietver
#ietver
#ietver
#ietver
#ietver "./debug.h"

nederīgstimer_callback(starpt signum)
{
struktūralaikatagad;
gettimeofday (&tagad, NULL);
printf("Signāls %d noķerts uz %li.%03li ", signum, now.tv_sec, now.tv_usec / 1000);
}

starptgalvenais()
{
neparakstītsstarpt atlikušais = 3;

struktūraitimervaljauns_taimeris;
struktūraitimervalold_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āls (SIGALRM, timer_callback);

kamēr (gulēt (atlicis) != 0)
{
ja (kļūda == EINTR)
debugf ("miegs tiek pārtraukts ar signālu");
cits
errorf("miega kļūda %s", strerror (errno));
}

atgriezties0;
}

Iepriekš minētais kods izmanto Gulēt() funkcija gaidīt trīs sekundes. Šajā laikā darbojas intervāla taimeris, vispirms vienu sekundi, pēc tam ar intervālu 300 milisekundes.

Lai labāk saprastu, saglabājiet un apkopojiet parauga kodu ar nosaukumu intervāls.c:

$ gcc -o intervāla intervāls.c
$ laiks ./intervāls
14. signāls noķerts uz 1653493614.325
atkļūdošana: miegu pārtrauc signāls (galvenais intervāls.c: 36)
14. signāls noķerts uz 1653493614.625
atkļūdošana: miegu pārtrauc signāls (galvenais intervāls.c: 36)
14. signāls noķerts uz 1653493614.925
atkļūdošana: miegu pārtrauc signāls (galvenais intervāls.c: 36)
14. signāls noķerts uz 1653493615.225
atkļūdošana: miegu pārtrauc signāls (galvenais intervāls.c: 36)
14. signāls noķerts uz 1653493615.525
...

Kā redzat no izvades pēc taimera darbības, tas izsauc atzvanīšanas funkciju ik pēc 300 milisekundēm.

Tomēr, pagaidot nedaudz ilgāk, pamanīsit, ka lietojumprogrammas darbība netiek pārtraukta. Tas turpina palaist atzvanīšanas funkciju ik pēc 300 milisekundēm. Ja palielināsit intervāla vērtību milisekundēs, redzēsit, ka lietojumprogramma tiek pārtraukta. Tas ir saistīts ar ierīces lietošanas apgabalu Gulēt() funkcija.

Taimeru izmantošanas nozīme operētājsistēmā Linux

Īpaši reāllaika lietojumprogrammām taimera mehānismam ir liela nozīme. Šis ir arī risinājums, ko izmanto veiktspējas optimizēšanai. Jūs pat varat to izmantot, lai izmērītu darbspējas laiku vai latentumu savā lietojumprogrammā. Ir svarīgi izmantot taimera mehānismus, lai sekotu līdzi pagājušajam laikam un laika pārejas notikumiem.

Kā kompilēt un instalēt programmatūru no avota operētājsistēmā Linux

Lasiet Tālāk

DalītiesČivinātDalītiesE-pasts

Saistītās tēmas

  • Programmēšana
  • Programmēšana
  • Linux padomi

Par autoru

Fatihs Küçükkarakurts (10 publicēti raksti)

Inženieris un programmatūras izstrādātājs, kurš ir matemātikas un tehnoloģiju cienītājs. Viņam vienmēr ir patikuši datori, matemātika un fizika. Viņš ir izstrādājis spēļu dzinēju projektus, kā arī mašīnmācīšanos, mākslīgos neironu tīklus un lineārās algebras bibliotēkas. Turklāt turpina strādāt pie mašīnmācības un lineārām matricām.

Vairāk no Fatih Küçükkarakurt

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai saņemtu tehniskos padomus, pārskatus, bezmaksas e-grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu