// ΡΠ°ΠΉΠΌΠ΅ΡΠ°, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΠ½ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ
struct itimerspec itime;
nsec2timespec(&itime.it_value, millisec * 1000000ull);
itime it_interval = itime.it_value;
if (!(ok = (timer_settime(timer, 0, &itime, NULL) == 0))) return;
}
// ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°Π½ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊ Π·Π°ΠΏΡΡΠ΅Π½:
bool OK(void) { return ok; }
bool statistic(void) { return st; }
};
int thrblock.code = _PULSE_CODE_MINAVAIL;
// ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°
void* syncthread(void *block) {
thrblock *p = (thrblock*)block;
struct _pulse buf;
pthread_attr_t attr;
while(true) {
// ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΡΠ»ΡΡΠ° ΠΎΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°
MsgReceivePulse(p->chid, &buf, sizeof(struct _pulse), NULL);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ ΡΠΎΠ³ΠΎ,
// ΠΊΡΠΎ Π΅Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π», Π²ΡΠ·ΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedparam(&attr, &p->param);
// Π·Π°ΠΏΡΡΠΊ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ "ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠΌ" ΠΏΠΎΡΠΎΠΊΠ΅
pthread_create(NULL, &attr, p->func, NULL);
if (p->statistic()) ++p->sync;
}
}
// 'ΠΏΡΡΡΠΎΠΉ' ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGINT (ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^Π‘)
inline static void empty(int signo) {}
int main(int argc, char **argv) {
// Ρ ΡΡΠΎΠΉ ΡΠΎΡΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^Π‘ ΠΎΡΠΌΠ΅Π½ΡΠ΅ΡΡΡ...
signal(SIGINT, empty);
// ΠΌΠ°ΡΡΠΈΠ² ΡΠ΅Π»Π΅Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
void(*funcs[])(void) = { &mon1, &mon2, &mon3 };
// ΠΏΠ΅ΡΠΈΠΎΠ΄Ρ ΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΡΠ΅ΡΠΈΠΉ Π·Π°ΠΏΡΡΠΊΠ°
int period[] = { 317, 171, 77 };
// ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ
// ΡΠΈΠ½Ρ ΡΠΎΡΠ΅ΡΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΡΠ΅ΡΠΈΠΉ
int priority[] = { 15, 5, 25 };
int num = sizeof(funcs) / sizeof(*funcs);
// Π·Π°ΠΏΡΡΠΊ 3-Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ
// Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²)
thrblock** tb = new (thrblock*)[num];
for (int i = 0; i < num; i++) {
tb[i] = new thrblock(funcs[i], period[i],
priority[i], true);
if (!tb[i]->OK())
perror("synchro thread create"), exit(EXIT_FAILURE);
}
// ... Π° ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ^Π‘.
pause();
// ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
cout << endl << "Monitoring finalisation!" << endl;
// Π²ΡΠ²ΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠ² Π±ΡΠ΄Π΅ΠΌ Π΄Π΅Π»Π°ΡΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ :
const double n2m = 1000000.;
for (int i = 0; i < num, i++) {
timestat *p = &tb[i]->sync;
!(*p); // ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ
cout << i << '\t' << p->num << "\t=> " << p->mean / n2m << " [" <<
p->tmin / n2m << "..." << p->tmax / n2m << "]\t~" << p->disp / n2m <<
" (" << p->disp / p->mean * 100 << "%)" << endl;
}
return EXIT_SUCCESS;
}
ΠΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠ΅Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ β thrblock, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π² Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ΅ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π² ΡΠ΅Ρ Π½ΠΈΠΊΠ΅ Β«Π°ΠΊΡΠΈΠ²Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²Β», Π½Π°Π²Π΅ΡΠ½Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΡΠΌ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎΠΌ Ρ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠΎΠ»Ρ Π. ΠΠΈΡΡΠ° β ActiveOberon ΠΈ Zormon. Π Π½Π΅ΠΉ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ (ΠΊΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ) ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Π΄Π°ΡΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΡΡΠΎΠΈΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π°Π΄ΡΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².[26]
ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΎΡΠ»ΠΈΡΠΈΡ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ, ΠΎΠ±ΡΡΠΆΠ΄Π°Π²ΡΠ΅ΠΉΡΡ Π²ΡΡΠ΅ (ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ²):
β’ ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ²ΠΎΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡΒ», ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΡΠΎΠΊΠΈΠΌ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
β’ ΠΠΎΡΠ»Π΅ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡΒ» ΠΏΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Β«ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌΒ». ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΎΠ±ΡΡΡ ΡΡ Π΅ΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
β’ ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΌΡ Π΅Π΅ ΠΏΠΎΡΠΎΠΊΡ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠΎΡΠΎΠ΄ΠΈΠ²ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (Π½ΠΎ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°!), Π²Π΅Π΄Ρ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π·Π½Π°ΡΠΈΠΌΠ°Ρ, ΠΊΠ°ΠΊ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΠΎΠ³Π»Π° Π²Π»ΠΈΡΡΡ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ°ΠΏΡΡΡΠΈΠΌ Π½Π°ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
# t3
+10+10*10+10+10.10*10+10+10*10+10+10.10*10+10+10+10*10+10.10+10*10+10+10*10+10.10+10*10+10+10*10+10.10+10+10*10+10+10+10.10+10+10*10+10+10.10*10+10+10+10*10+10.10+10*10+10+10*10+10+10.10*10+10+10*10+10+10.10+10*10+10+10*10+10.10+10*10+10+10*10+10.10+10+10*10+10+10*10^C
Monitoring finalisation!
0 32 => 316.919 [316.867...317.895] ~0.178511 (0.056327%)
1 59 => 170.955 [168.583...173.296] ~0.92472 (0.540914%)
2 132 => 76.9796 [76.942...77.9524] ~0.085977 (0.111688%)
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ»ΠΈΡΠ½ΡΡ ΡΠΎΡΠ½ΠΎΡΡΡ Π²ΡΠ΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° Π²ΡΠ²ΠΎΠ΄Π°). ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ ΠΏΠΎΡΠΎΠ΄ΠΈΠ²ΡΠ΅Π³ΠΎ Π΅Π΅ ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΆΠΈΡΠ½ΡΠΌ ΡΡΠΈΡΡΠΎΠΌ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
# t3
+25+25*5+25+25.15*5+25+25*5+25+25.15*5+25+25+25*5+25.15+25*5+25+25*5+25.15+25*5+25+25*5*5+25.15+25+25*5+25+25*5.15+25+25*5+25+25.15*5+25+25+25*5+25.15+25*5+25+25*5+25+25.15*5+25+25*5+25+25^C
Monitoring finalisation!
0 32 => 316.919 [316.797...317.915] ~0.185331 (0.0584792%)
1 60 => 170.955 [168.964...173.925] ~0.47915 (0.280279%)
2 34 => 76.9796 [76.8895...77.9694] ~0.0937379 (0.12177%)
Π ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ (ΠΈ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ) ΠΌΡ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎ Π»ΠΈΠΊΠ²ΠΈΠ΄ΠΈΡΠΎΠ²Π°Π»ΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ: ΡΡΠ°Π±ΠΎΡΠ°Π²ΡΠΈΠΉ ΡΠ°ΠΉΠΌΠ΅Ρ β ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° β ΡΠ΅Π»Π΅Π²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠΎ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π»ΠΈ, Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΉ Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π°, Π½ΠΎ Π²ΡΠ΅ ΠΆΠ΅ ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π°Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ» Π²ΡΠ΅ΠΌ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌ ΡΠ΅Π»ΡΠΌ.
3. Π‘ΠΈΠ³Π½Π°Π»Ρ
Π‘ΠΈΠ³Π½Π°Π»Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΡΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈ ΠΏΠΎΡΡΠ»Π°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ Π½Π΅ΡΡΠΎ Π½Π΅ΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΠΎΠ΅, ΡΡΠ΅Π±ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠ΅Π°ΠΊΡΠΈΠΈ. ΠΠΎΡΠΎΠΆΠ΄Π°ΡΡΠ΅Π΅ ΡΠΈΠ³Π½Π°Π» ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½ΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΠ΄ΡΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. Π‘ΠΈΠ³Π½Π°Π»Ρ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΌΡΡ ΡΡΠ°ΡΡΡ ΠΈ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² UNIX.[27]
Π£ΠΆΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠ»ΡΡΠΈΡΡ, ΡΡΠΎ:
β’ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π°, ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌΠΈ;
β’ ΡΠΈΠ³Π½Π°Π»Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅Π΅, Π½ΠΎ ΠΌΠΎΡΠ½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ, Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΡΡΠΎ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π½Π΅ ΡΠ°ΠΊ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΈΠ³Π½Π°Π»Ρ ΠΏΡΠΈΠΏΠΈΡΠ°Π½ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° SIG*. ΠΡΠ΅ ΠΎΡΠ½ΠΎΡΡΡΠΈΠ΅ΡΡ ΠΊ ΡΠΈΠ³Π½Π°Π»Π°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <signal.h>, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ. Π ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ, ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΠΊΡΡ.
ΠΠΎΡΠ»Π°Π½Π½ΡΠΉ ΡΠΈΠ³Π½Π°Π» ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΌ Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ (ΠΊΠ°ΠΊ ΡΠΆΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ: ΡΡΠΎ ΠΏΠ°ΡΡΠΈΠ²Π½Π°Ρ ΡΡΠ±ΡΡΠ°Π½ΡΠΈΡ; ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΡΠ΅ΡΡ Π² ΡΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΈΠ΄Π΅Ρ ΠΎΠ± ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π° Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°). ΠΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠΈΠ³Π½Π°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ (ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°, Π½Π°Π·ΡΠ²Π°ΡΡ Π΄ΠΈΡΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΡΠΈΠ³Π½Π°Π»Π°):
β’ Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ β Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΏΡΠ΅Π΄ΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΡΡΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ; Π΅ΡΡΡ ΡΠΈΠ³Π½Π°Π»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΡΡ. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΡΡΠΈΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΏΡΠ΅Π΄ΠΏΠΈΡΠ°Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π΄Π°ΠΌΠΏΠ° ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ (core dump), Π½ΠΎ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ SYSINT (Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ [Ctrl+C]), ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΠ°ΠΊΠΎΠΉ Π΄Π°ΠΌΠΏ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ.
β’ ΠΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Π° β ΡΠΈΠ³Π½Π°Π» Π½Π΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π° Ρ ΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ.
β’ ΠΡΠ·ΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° β ΠΏΠΎ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΡΠ»ΠΈ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠΎ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΡΠΈΠ³Π½Π°Π» ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΡΡΡ (ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ).
ΠΠ»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π² Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΈΡ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠΈΡΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ Π²ΡΠ΅Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΠ³Π½Π°Π»Ρ SIGKILL ΠΈ SIGSTOP Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½ΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Ρ, Π½ΠΈ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Ρ. ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠ΅ Π΄Π°Π»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ QNX, Π½Π°ΡΠΈΠ½Π°Ρ Ρ SIGSELECT ΠΈ Π΄Π°Π»Π΅Π΅.