Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 106

Автор Майкл ДТонсон

Π’ 32-разрядных систСмах Linux, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм Unix, пСрСмСнная time_t являСтся Ρ†Π΅Π»Ρ‹ΠΌ числом со Π·Π½Π°ΠΊΠΎΠΌ Π΄Π»ΠΈΠ½ΠΎΠΉ 32 Π±ΠΈΡ‚Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² 10:14:07 Π²Π΅Ρ‡Π΅Ρ€Π° 18 января (Ρ‡Π΅Ρ‚Π²Π΅Ρ€Π³) 2038 Π³ΠΎΠ΄Π° ΠΎΠ½Π° пСрСполнится. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ врСмя 10:14:08 Π²Π΅Ρ‡Π΅Ρ€Π° 18 января (Ρ‡Π΅Ρ‚Π²Π΅Ρ€Π³) 2038 Π³ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСно ΠΊΠ°ΠΊ 3:45:52 Π²Π΅Ρ‡Π΅Ρ€Π° 13 дСкабря (пятница) 1901 Π³ΠΎΠ΄Π°. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, систСма Linux Π½Π΅ проявляСт "ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ 2000-Π³ΠΎ Π³ΠΎΠ΄Π°" (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ собствСнныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ), ΠΎΠ΄Π½Π°ΠΊΠΎ с Π½Π΅ΠΉ связана "ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° 2038-Π³ΠΎ Π³ΠΎΠ΄Π°".

На 64-разрядных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… пСрСмСнная time_t являСтся соотвСтствСнно 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ числом со Π·Π½Π°ΠΊΠΎΠΌ. Π­Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ эффСктивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 64-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ врСмя со Π·Π½Π°ΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ астрономичСским.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ врСмя, Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ врСмя для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ систСмы ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ daytime.с.

 1: /* daytime.с */

 2:

 3: #include <stdio.h>

 4: #include <sys/time.h>

 5: #include <unistd.h>

 6:

 7: int main () {

 8:  struct timeval tv;

 9:  struct timezone tz;

10:  time_t now;

11:  /* beginning_of_time β€” это наимСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ, измСряСмоС time_t*/

12:  time_t beginning_of_time = 1L<<(sizeof(time_t)*8 - 1);

13:  /* end_of_time - это наибольшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, измСряСмоС time_t */

14:  time_t end_of_time = ~beginning_of_time;

15:

16:  printf("time_t ΠΈΠΌΠ΅Π΅Ρ‚ %d Π±ΠΈΡ‚ Π² Π΄Π»ΠΈΠ½Ρƒ\n\n", sizeof(time_t) *8);

17:

18:  gettimeofday(&tv, &tz);

19:  now = tv.tv_sec;

20:  printf("Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя дня, прСдставлСнноС Π² Π²ΠΈΠ΄Π΅ структуры timeval:\n"

21:   "tv.tv_sec = 0x%08x, tv.tv_usec = 0x%08Ρ…\n"

22:   "tz.tz_minuteswest = 0x%08Ρ…, tz.tz_dsttime = 0x%08x\n\n",

23:   tv.tv_sec, tv.tv_usec, tz.tz_minuteswest, tz.tz_dsttime);

24:

25:  printf("ДСмонстрация ctime()%s:\n",

26:   sizeof(time_t)*8 <= 32 ? "" :

27:   " (ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ½ΡƒΡ‚ΡŒ послС ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки; Π½Π°ΠΆΠΌΠΈΡ‚Π΅ "

28:   "Control-C)") ;

29:  printf("Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя: %s", ctime(&now));

30:  printf("Π½Π°Ρ‡Π°Π»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: %s", ctime(&beginning_of_time));

31:  printf("ΠΊΠΎΠ½Π΅Ρ† Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: %s", ctime(&end_of_time));

32:

33:  exit(0);

34: }

К соТалСнию, функция ctime() являСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠΎ своСй ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° (ΠΏΡ€ΠΈ Π»ΡŽΠ±Ρ‹Ρ… практичСских цСлях) Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² 64-разрядных систСмах Π΄Π°ΠΆΠ΅ для астрономичСских Π΄Π°Ρ‚ (Π²Ρ€ΠΎΠ΄Π΅ 64-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π°Ρ‡Π°Π»Π° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ). Если Π²Ρ‹ устали ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Control-C для Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

18.2. ИспользованиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ²

Π’Π°ΠΉΠΌΠ΅Ρ€ β€” это простоС срСдство для ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ событиС. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ цикличСски Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ лишниС растраты Ρ†ΠΈΠΊΠ»ΠΎΠ² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² ядро запрос Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ увСдомлСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° способа примСнСния Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ²: синхронный ΠΈ асинхронный. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΠ΅ использованиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² СдинствСнном Ρ€Π΅ΠΆΠΈΠΌΠ΅ β€” Ρ€Π΅ΠΆΠΈΠΌΠ΅ оТидания (Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ истСчСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°). Асинхронная Ρ€Π°Π±ΠΎΡ‚Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΊΠ°ΠΊ ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ асинхронного устройства, сопровоТдаСтся сигналами. Π‘ΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ синхронный Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сигналы.

18.2.1. РСТим оТидания

ΠŸΡ€ΠΎΡ†Π΅ΡΡ, ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉΡΡ запросом Π½Π° Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ количСства Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, называСтся ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ (ΠΈΠ»ΠΈ "спящим"). Для Ρ€Π΅ΠΆΠΈΠΌΠ° оТидания доступны Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; каТдая ΠΈΠ· Π½ΠΈΡ… измСряСт врСмя Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ…. Они Ρ‚Π°ΠΊΠΆΠ΅ Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ частями систСмы ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

unsigned int sleep(unsigned int seconds);

Ѐункция sleep() Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс Π·Π°ΡΡ‹ΠΏΠ°Ρ‚ΡŒ Π½Π° врСмя (Π² сСкундах), ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ seconds, ΠΈΠ»ΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° процСсс Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ функция sleep() рСализуСтся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… сигнала SIGALRM, поэтому ΠΎΠ½Π° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ совмСщаСтся с систСмным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ alarm(), созданиСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° SIGALRM, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сигнала SIGALRM, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² (Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄Π°Π»Π΅Π΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈ сигнал.

Если Ρ€Π°Π±ΠΎΡ‚Π° sleep() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ истСчСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ сСкунд. Если Ρ€Π΅ΠΆΠΈΠΌ оТидания длился Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΠΎΡΡŒ, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль.

void usleep(unsigned long usec);

Ѐункция usleep() Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс Π·Π°ΡΡ‹ΠΏΠ°Ρ‚ΡŒ Π½Π° врСмя (Π² микросСкундах), ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ usec. НикакиС сигналы Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. На Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ usleep() рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ select().

int select(0, NULL, NULL, NULL, struct timeval tv);

Ѐункция select(), описанная Π² Π³Π»Π°Π²Π΅ 13, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ откладывания процСссов Π½Π° Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ struct timeval минимальноС врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ β€” Π½ΠΈ ΠΎΠ΄Π½ΠΎ событиС Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚.

int nanosleep(struct timespec *req, struct timespec *rem);

Ѐункция nanosleep() Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс Π·Π°ΡΡ‹ΠΏΠ°Ρ‚ΡŒ Π½Π° врСмя, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ req (описаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° timespec ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ этой Π³Π»Π°Π²Ρ‹), ΠΏΠΎΠΊΠ° процСсс Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал. Если Ρ€Π°Π±ΠΎΡ‚Π° nanosleep() прСкращаСтся Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈΠ·-Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ сигнала, Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 ΠΈ устанавливаСт для errno Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EINTR, Π° Ρ‚Π°ΠΊΠΆΠ΅, Ссли rem Π½Π΅ являСтся NULL, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ rem количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π΅ оТидания.

Ѐункция nanosleep() Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ пСрСносима ΠΈΠ· всСх рассмотрСнных, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ спСцификации POSIX.1b Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Ρ€Π°Π½Π΅Π΅ ΠΎΠ½Π° Π½Π°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ POSIX.4), которая выполняСтся Π½Π΅ Π²ΠΎ всСх вСрсиях Unix. Однако всС Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Unix ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΅Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ POSIX.1b Π² настоящСС врСмя ΡΠ²Π»ΡΡŽΡ‚ΡΡ стандартной Ρ‡Π°ΡΡ‚ΡŒΡŽ Single Unix Specification (Единая спСцификация Unix).

НС всС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ nanosleep(), ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ Linux, ΠΊΠ°ΠΊ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, стрСмится ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ запросы Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ с ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² [12].

18.2.2. Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹

Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ сигналы Π² процСсс Π½Π° систСматичСской основС. Π’ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° систСматичСский зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ процСссом ассоциированы Ρ‚Ρ€ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.

ITIMER_REAL ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ‚ врСмя Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… настСнных часов β€” Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π² зависимости ΠΎΡ‚ выполнСния процСсса) β€” ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал SIGALRM. НСсовмСстим с систСмным Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ alarm(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sleep(). НС примСняйтС Π½ΠΈ alarm(), Π½ΠΈ sleep(), Ссли имССтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€. ITIMER_VIRTUAL ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ врСмя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ исполнСнии процСсса β€” Π½Π΅ учитывая систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ процСсс β€” ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал SIGVTALRM. ITIMER_PROF ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ врСмя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ процСсса β€” Π²ΠΊΠ»ΡŽΡ‡Π°Ρ врСмя, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ядро посылаСт ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ процСсса, ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ врСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ процСсса ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ самого процСсса β€” ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал SIGPROF. Π£Ρ‡Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, оказываСтся Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ настройки Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² ITIMER_VIRTUAL ΠΈ ITIMER_PROF часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄Π°Ρ….

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ассоциированный сигнал ΠΎΠ± истСчСнии Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π° систСмных часов (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, 1-10 миллисСкунд). Если процСсс Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Π΄Π°Π½Π½ΠΎΠ΅ врСмя, Ρ‚ΠΎ сигнал гСнСрируСтся сразу ΠΆΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС сигнал гСнСрируСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ (Π² зависимости ΠΎΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ITIMER_VIRTUAL слСдит Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса, Ρ‚ΠΎ сигнал всСгда доставляСтся Π½Π΅Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ структуру struct itimerval для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ запроса ΠΈ установки ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ².

struct itimerval {

 struct timeval it_interval;

 struct timeval it_value;

};

Π§Π»Π΅Π½ it_value ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ Π΄ΠΎ отправлСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сигнала. Π§Π»Π΅Π½ it_interval опрСдСляСт врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ сигналами; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ истСчСнии Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ it_value.