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-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π½Π°Π²ΡΠ΅Π³Π΄Π° β ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Π΅ΠΉ ΠΌΡ ΠΏΠΎΡΠ΅ΡΡΠ»ΠΈ, Π° Π·Π½Π°ΡΠΈΡ, ΠΈ ΠΎΡΠ²Π΅Ρ ΠΈΠΌ Π΄Π°ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ.