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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

Оба ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° it_value ΠΈ it_interval фактичСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ структурами Ρ‚ΠΈΠΏΠ° struct timespec β€” Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ POSIX-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Ρ‚Π° структура позволяСт Π²Π°ΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π΄ΠΎΠ»Π΅ΠΉ сСкунд. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π΅ элСмСнт, tv_sec, β€” это число сСкунд, Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт, tv_nsec, β€” число наносСкунд Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сСкундС. (Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ слСдуСт ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ tv_nsec Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ 1 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ β€” это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ смСщСниС Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 1 сСкунду).

НСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:

it_value.tv_sec = 5;

it_value.tv_nsec = 500000000;

it_interval.tv_sec = 0;

it_interval.tv_nsec = 0;

Π­Ρ‚ΠΎ сформируСт ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сработаСт Ρ‡Π΅Ρ€Π΅Π· 5,5 сСкунды. (5,5 сСкунд складываСтся ΠΈΠ· 5 сСкунд ΠΈ 500,000,000 наносСкунд.)

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ здСсь, Ρ‡Ρ‚ΠΎ этот Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ это Π±Ρ‹Π»ΠΎ Π½Π΅ Ρ‚Π°ΠΊ, Ρ‚ΠΎ Π΅Π³ΠΎ врСмя срабатывания ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ Π±Ρ‹ Π΅Π³ΠΎ истСкло (5.5 сСкунд с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° 00:00 ΠΏΠΎ Π“Ρ€ΠΈΠ½Π²ΠΈΡ‡Ρƒ, 1 января 1970).

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

it_value.tv_sec = 987654321;

it_value.tv_nsec = 0;

it_interval.tv_sec = 0;

it_interval.tv_nsec = 0;

Данная комбинация ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сформируСт ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сработаСт Π² Ρ‡Π΅Ρ‚Π²Π΅Ρ€Π³, 19 апрСля 2001 Π³ΠΎΠ΄Π° Π² 00:25:21 ΠΏΠΎ EDT. (БущСствуСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ воспринимаСмый Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² «число сСкунд, ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅ с 00:00:00 ΠΏΠΎ Π“Ρ€ΠΈΠ½Π²ΠΈΡ‡Ρƒ, 1 января 1970 Π³ΠΎΠ΄Π°Β». Π‘ΠΌ. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ time(), asctime(), ctime(), mktime(), strftime(), ΠΈ Ρ‚.Π΄.).

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ достаточно Π΄ΠΎΠ»Π³ΠΎ (987654321 сСкунд β€” ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 31.3 Π³ΠΎΠ΄Π°).

ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»: Β«ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΒ». Π’ ΠΊΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timer_settime() Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²! Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, являСтся Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π§Ρ‚ΠΎ Π΄ΠΎ ядра, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ просто счастливо Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ событиС Π½Π° 31.3 Π³ΠΎΠ΄Π° Π²ΠΏΠ΅Ρ€Π΅Π΄.

И Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

it_value.tv_sec = 1;

it_value.tv_nsec = 0;

it_interval.tv_sec = 0;

it_interval.tv_nsec = 500000000;

Если ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΎΠ½ сработаСт Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ сСкунду ΠΈ Π΄Π°Π»Π΅Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ полсСкунды. НС сущСствуСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ подобия Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ значСниям Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ срабатывания.

Π‘Π΅Ρ€Π²Π΅Ρ€ с пСриодичСскими ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°ΠΌΠΈ

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, β€” это сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠ΅Π»Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ пСриодичСскиС сообщСния. Π’ΠΈΠΏΠΎΠ²Ρ‹ΠΌΠΈ примСнСниями Ρ‚Π°ΠΊΠΎΠΉ схСмы ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

β€’ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ сСрвСром Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹ клиСнтских запросов;

β€’ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ пСриодичСскиС события сСрвСров.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, спСциализированныС, примСнСния для Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пСриодичСскиС подтвСрТдСния готовности ΡƒΠ·Π»ΠΎΠ² сСти («я ΠΆΠΈΠ²Β»), запросы Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ, ΠΈ Ρ‚.ΠΏ.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ сСрвСром Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹

Π’ Ρ‚Π°ΠΊΠΎΠΌ сцСнарии сСрвСр прСдоставляСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ услугу, ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ способСн Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² самых Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСниях. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ сСрвСру Β«Π²Ρ‹Π΄Π°ΠΉ ΠΌΠ½Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° 15 сСкунд» ΠΈΠ»ΠΈ Β«Π΄Π°ΠΉ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° истСкут 10 сСкунд», ΠΈΠ»ΠΈ Β«ΠΆΠ΄ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 2 сСкунд».

ВсС это β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… сСрвСром Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ². ΠšΠ»ΠΈΠ΅Π½Ρ‚ посылаСт сообщСниС сСрвСру ΠΈ блокируСтся. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ пСриодичСскиС сообщСния ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (Ρ€Π°Π· Π² сСкунду, Ρ€Π΅ΠΆΠ΅ ΠΈΠ»ΠΈ Ρ‡Π°Ρ‰Π΅) ΠΈ подсчитываСт, сколько этих сообщСний ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ». Когда число сообщСний ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°Ρ… ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ врСмя оТидания, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, сСрвСр ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ с сообщСниСм ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π΅ ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ успСл Π½Π°ΠΊΠΎΠΏΠΈΡ‚ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” это зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ структурированы ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСрвСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… сообщСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡƒΡ€Ρ‹ ΠΈ сообщСния ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π΅ Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ клиСнтскоС сообщСниС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ сСрвСру: Β«Π”Π°ΠΉ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ для мСня Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠΉ мСня Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° 5 сСкунд». Π’Ρ‚ΠΎΡ€ΠΎΠ΅ клиСнтскоС сообщСниС Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: Β«Π’ΠΎΡ‚, возьми Π΄Π°Π½Π½Ρ‹Π΅Β». Π‘Π΅Ρ€Π²Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ нСскольким ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° сСбС Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ поэтому обязан ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹. Π’ΡƒΡ‚-Ρ‚ΠΎ ΠΈ Π½ΡƒΠΆΠ΅Π½ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ; ΠΎΠ½ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ сСрвСр: Β«Π˜ΡΡ‚Π΅ΠΊΠ»Π° ΠΎΠ΄Π½Π° сСкунда».

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ выглядСла излишнС Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΉ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· основных Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² я ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽ исходный тСкст нСбольшими пояснСниями. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° FTP-сайтС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ PARSE (ftp://ftp.parseftp.parse.com/pub/book_v3.tar.gz), Ρ„Π°ΠΉΠ» называСтся time1.с.

Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ константы ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…. Π’ Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. ΠžΡΡ‚Π°Π²ΠΈΠΌ это Π±Π΅Π· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². :-)

/*

 * time1.c

 *

 * ΠŸΡ€ΠΈΠΌΠ΅Ρ€ сСрвСра, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ пСриодичСскиС сообщСния

 * ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

 * ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ сообщСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

 *

 * Π˜Π»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° с ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°ΠΌΠΈ.

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <signal.h>

#include <errno.h>

#include <unistd.h>

#include <sys/siginfo.h>

#include <sys/neutrino.h>


// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ сообщСния


// БообщСния

#define MT_WAIT_DATA 2 // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

#define MT_SEND_DATA 3 // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°


// Π˜ΠΌΠΏΡƒΠ»ΡŒΡΡ‹

#define CODE_TIMER 1 // Π˜ΠΌΠΏΡƒΠ»ΡŒΡ ΠΎΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°


// ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡ‹Π΅ сообщСния

#define MT_OK       0 // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

#define MT_TIMEDOUT 1 // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ


// Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° сообщСния

typedef struct {

 int messageType; // Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ сообщСниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ

                  // ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

 int messageData; // ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, зависят ΠΎΡ‚

                  // ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡ

} ClientMessageT;


typedef union {

 ClientMessageT msg;  // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ

                      // Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ,

 struct _pulse pulse; // Π»ΠΈΠ±ΠΎ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠΌ

} MessageT;


// Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

#define MAX_CLIENT 16 // ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

                      // ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ


struct {

 int in_use;  // Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ?

 int rcvid;   // Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

              // отправитСля ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

 int timeout; // ΠžΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

              //Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚

} clients[MAX_CLIENT]; // Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²


int chid; // Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ°Π½Π°Π»Π°

          // (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ)


int debug = 1; // Π Π΅ΠΆΠΈΠΌ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, 1 ==

               // Π²ΠΊΠ», 0 == Π²Ρ‹ΠΊΠ»


char *progname = "time1.c";


// ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹

static void setupPulseAndTimer(void);

static void gotAPulse(void);

static void gotAMessage(int rcvid, ClientMessageT *msg);

main()

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» ΠΊΠΎΠ΄Π° являСтся основным ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ChannelCreate();

β€’ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ setupPulseAndTimer() (для настройки пСриодичСского Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π· Π² сСкунду ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ Π² качСствС способа доставки события;

β€’ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, бСсконСчный Ρ†ΠΈΠΊΠ» оТидания ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ² ΠΈ сообщСний ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ MsgReceive() β€” Π½ΡƒΠ»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» принят ΠΈΠΌΠΏΡƒΠ»ΡŒΡ (здСсь ΠΌΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, наш Π»ΠΈ это ΠΈΠΌΠΏΡƒΠ»ΡŒΡ), Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ принято сообщСниС.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ² ΠΈ сообщСний выполняСтся функциями gotAPulse() ΠΈ gotAMessage().

int main void) // Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

               // ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки

{

 int rcvid; // PID отправитСля

 MessageT msg; // Π‘Π°ΠΌΠΎ сообщСниС

 if ((chid = ChannelCreate(0)) == -1) {

  fprintf(stderr, "%s: Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π»!\n",

   progname);

  perror(NULL);

  exit(EXIT_FAILURE);

 }

 // ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€

 setupPulseAndTimer();

 // ΠŸΡ€ΠΈΠ΅ΠΌ сообщСний

 for(;;) {

  rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL));

  // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΎΡ‚ ΠΊΠΎΠ³ΠΎ сообщСниС

  if (rcvid == 0) {

   // Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Β«codeΒ»...

   gotAPulse();

  } else {