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

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

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

   progname);

  perror(NULL);

  exit(EXIT_FAILURE);

 }

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

 setupPulseAndTimer();

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

 for(;;) {

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

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

  if (rcvid == 0) {

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

   gotAPulse();

  } else {

   gotAMessage(rcvid, &msg.msg);

  }

 }

 // Бюда ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ добСрСмся

 return (EXIT_SUCCESS);

}

setupPulseAndTimer()

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setupPulseAndTimer() Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся Ρ‚ΠΈΠΏ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈ схСма увСдомлСния. Когда ΠΌΡ‹ рассуТдали ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π½Ρ‹Ρ… функциях Π²Ρ‹ΡˆΠ΅, я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π°Ρ‚ΡŒ сигнал ΠΈΠ»ΠΈ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ, Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ. РСшСниС ΠΎΠ± этом принимаСтся ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setupPulseAndTimer(). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь ΠΌΡ‹ использовали ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ SIGEV_PULSE_INIT(). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ это ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΌΡ‹ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ присвоили элСмСнту sigev_notify Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SIGEV_PULSE. (Если Π±Ρ‹ ΠΌΡ‹ использовали ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ сСмСйства SIGEV_SIGNAL*_INIT(), ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сигнала). ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ настройкС ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ° ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° ConnectAttach() устанавливаСм соСдинСниС с самим собой ΠΈ Π΄Π°Π΅ΠΌ Π΅ΠΌΡƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ (здСсь β€” константа CODE_TIMER; ΠΌΡ‹ Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ сами)

ПослСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ структуры события β€” это ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°; здСсь ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ SIGEV_PULSE_PRIO_INHERIT (константа, равная -1). Π­Ρ‚ΠΎ прСдписываСт ядру Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’ ΠΊΠΎΠ½Ρ†Π΅ описания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ timer_create() для создания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² ядрС, послС Ρ‡Π΅Π³ΠΎ настраиваСм Π΅Π³ΠΎ Π½Π° срабатываниС Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ сСкунду (ΠΏΠΎΠ»Π΅ it_value) ΠΈ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ односСкундными ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°ΠΌΠΈ (ΠΏΠΎΠ»Π΅ it_interval). ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π²Ρ‹Π·ΠΎΠ²Ρƒ timer_settime(), Π° Π½Π΅ ΠΏΡ€ΠΈ Π΅Π³ΠΎ создании.

Π‘Ρ…Π΅ΠΌΠ° увСдомлСния ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ SIGEV_PULSE β€” Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, свойствСнноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ QNX/Neutrino. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ² Π² POSIX отсутствуСт.

/*

 * setupPulseAndTimer

 *

 * Π­Ρ‚Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° настройку ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹

 * Ρ‚ΠΎΡ‚ отправлял сообщСниС с ΠΊΠΎΠ΄ΠΎΠΌ MT_TIMER.

 * Π—Π°Ρ‚Π΅ΠΌ устанавливаСтся

 * пСриодичСский Ρ‚Π°ΠΉΠΌΠ΅Ρ€ с ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠΌ Π² ΠΎΠ΄Π½Ρƒ сСкунду.

*/

void setupPulseAndTimer(void) {

 timer_t timerid; // Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

 struct sigevent event; // Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ событиС

 struct itimerspec timer; // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…

                          // Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

 int coid; // Π‘ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ с

           // собой

 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» ΠΊ сСбС

 coid = ConnectAttach(0, 0, chid, 0, 0);

 if (coid == -1) {

  fprintf(stderr, "%s: ошибка ConnectAttach!\n", progname);

  perror(NULL);

  exit(EXIT_FAILURE);

 }

 // Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ событиС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

 // - ΠΈΠΌΠΏΡƒΠ»ΡŒΡ

 SIGEV_PULSE_INIT(&event, coid, SIGEV_PULSE_PRIO_INHERIT,

  CODE_TIMER, 0);

 // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ

 if (timer_create(CLOCK_REALTIME, &event, &timerid) ==

  -1) {

  fprintf(stderr,

   "%s: Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, errno %d\n",

   progname, errno);

  perror(NULL);

  exit(EXIT_FAILURE);

 }

 // ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ (Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° 1 с, ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π·

 // 1 с) ...

 timer.it_value.tv_sec = 1;

 timer.it_value.tv_nsec = 0;

 timer.it_interval.tv_sec = 1;

 timer.it_interval.tv_nsec = 0;

 // ...ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ!

 timer_settime(timerid, 0, &timer, NULL);

}

gotAPulse()

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gotAPulse() Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ сСрвСра ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹ для ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ΠœΡ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ просматриваСм список ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡƒΡ€Ρ‹ ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ выдаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² сСкунду, просто ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ число сСкунд, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ остаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π΄ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°. Если эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° достигаСт Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния, ΠΌΡ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ этому ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сообщСниСм Β«Π˜Π·Π²ΠΈΠ½ΠΈΡ‚Π΅, Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Β» (Ρ‚ΠΈΠΏ сообщСния MT_TIMEDOUT). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ это сообщСниС Π·Π°Ρ€Π°Π½Π΅Π΅ (Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π° for), Π° Π·Π°Ρ‚Π΅ΠΌ посылаСм Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌ β€” ΠΏΠΎ сущСству вопрос стиля: Ссли Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ часто, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ смысл Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ настройку ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΈ загодя. Если ΠΆΠ΅ мноТСство ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π΅ оТидаСтся, Ρ‚ΠΎ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ‹ больший смысл Π΄Π΅Π»Π°Ρ‚ΡŒ настройки ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΅Ρ‰Π΅ Π½Π΅ достигло нуля, ΠΌΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ сообщСния.

/*

 * gotAPulse

 *

 * Π­Ρ‚Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ².

 * Она провСряСт список ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°

 * ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ сообщСниСм Ρ‚Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ,

 * Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π».

*/

void gotAPulse(void) {

 ClientMessageT msg;

 int i;

 if (debug) {

  time_t now;

  time(&now);

  printf("ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΈΠΌΠΏΡƒΠ»ΡŒΡ, врСмя %s", ctime(&now));

 }

 // ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΠ΅ сообщСниС

 msg.messageType = MT_TIMEDOUT;

 // ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ список ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

 for (i = 0; i < MAX_CLIENT; i++) {

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

  if (clients[i].in_use) {

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

   if (--clients[i].timeout == 0) {

    // ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ

    MsgReply(clients[i].rcvid, EOK, &msg, sizeof(msg));

    // ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ элСмСнт

    clients[i].in_use = 0;

   }

  }

 }

}

gotAMessage()

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gotAMessage() Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π³Π΄Π΅ ΠΌΡ‹ добавляСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² список ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡƒΡ€Ρ‹, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Π΅ (Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сообщСниС Ρ‚ΠΈΠΏΠ° MT_WAIT_DATA), ΠΈΠ»ΠΈ сопоставляСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с сообщСниСм, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ (Ссли это сообщСниС Ρ‚ΠΈΠΏΠ° MT_SEND_DATA). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ для простоты ΠΌΡ‹ здСсь Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², находящихся Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅Ρ‰Π΅ Π½Π΅ доступСн β€” это вопрос управлСния очСрСдями, ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ для сСбя Π² качСствС упраТнСния.

/*

 * gotAMessage

 *

 * Π­Ρ‚Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вызываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅

 * ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ‚ΠΈΠΏ

 * сообщСния (Π»ΠΈΠ±ΠΎ Β«ΠΆΠ΄Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…Β», Π»ΠΈΠ±ΠΎ Β«Π²ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Π΅Β»),

 * ΠΈ дСйствуСм

 * соотвСтствСнно. Для простоты ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅

 * Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΆΠ΄ΡƒΡ‚.

 * Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ± этом см. Π² тСкстС.

*/

void gotAMessage(int rcvid, ClientMessageT *msg) {

 int i;

 // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ сообщСния

 switch (msg->messageType) {

 // ΠšΠ»ΠΈΠ΅Π½Ρ‚ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…

 case MT_WAIT_DATA:

  // ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ пустоС мСсто Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²

  for (i = 0; i < MAX_CLIENT; i++) {

   if (!clients[i].in_use) {

    // Нашли мСсто - ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ занятоС,

    // ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ rcvid

    // ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚

    clients[i].in_use = 1;

    clients[i].rcvid = rcvid;

    clients[i].timeout = 5;

    return;

   }

  }

  fprintf(stderr,

   "Π’Π°Π±Π»ΠΈΡ†Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π°, сообщСниС ΠΎΡ‚ rcvid %d"

   " ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½\n", rcvid);

  break;

  // ΠšΠ»ΠΈΠ΅Π½Ρ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

 case MT_SEND_DATA:

  // ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ

  // Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

  for (i = 0; i < MAX CLIENT; i++) {

   if (clients[i].in_use) {

    // Нашли - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ сообщСниС

    // Π² качСствС ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΠ³ΠΎ

    msg->messageType = MT_OK;

    // ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ ΠžΠ‘ΠžΠ˜Πœ ΠšΠ›Π˜Π•ΠΠ’ΠΠœ!

    MsgReply(clients[i].rcvid, EOK, msg, sizeof(*msg));

    MsgReply(rcvid, EOK, msg, sizeof(*msg));

    clients[i].in_use = 0;

    return;

   }

  }

  fprintf(stderr,

   "Π’Π°Π±Π»ΠΈΡ†Π° пуста, сообщСниС ΠΎΡ‚ rcvid %d ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ,"

   " ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½\n", rcvid);

  break;

 }

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

НСсколько ΠΎΠ±Ρ‰ΠΈΡ… Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ ΠΏΠΎ тСксту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

β€’ Π•сли сообщСниС с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ±Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π»ΠΈΠ±ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΆΠ΄Π΅Ρ‚, Π»ΠΈΠ±ΠΎ список ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½, Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ ошибок выводится сообщСниС, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΏΡ€ΠΈ этом ΠΌΡ‹ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ряд ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² REPLY-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии навсСгда β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΌΡ‹ потСряли, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈΠΌ Π΄Π°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ.