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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 25

Автор ОлСг Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ

  // Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ фактичСски ΠΈ запускаСтся

  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 ΠΈ Π΄Π°Π»Π΅Π΅.