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

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

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

β€’ SIGWINCH [20] β€” сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гСнСрируСтся (Π² консольном Ρ€Π΅ΠΆΠΈΠΌΠ΅ pterm ΠΈ xterm ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ Π΅Π³ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ²) ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠΊΠ½Π° (window size change) для Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΎΠΊΠ½Π΅ прилоТСния (mc, mqc…), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ пСрСрисовало свой экран Π²Ρ‹Π²ΠΎΠ΄Π°.

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

Π’ QNX ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΅Ρ‰Π΅ Π΄Π²Π° спСцифичСских сигнала, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вряд Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ для нас интСрСс:

β€’ SIGIOT [6] β€” IOT-инструкция; Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ гСнСрируСтся для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ x86.

β€’ SIGPWR [19] β€” сигнал power-fail restart ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ QNX Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ говорится, Π½ΠΎ Π² ΠΏΡ€Π΅Π°ΠΌΠ±ΡƒΠ»Π΅, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅ΠΉ нововвСдСния вСрсии 6.2.1, сказано: Β«corrected SIGPWR to SIGTERMΒ», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ этот сигнал, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, β€” Ρ€ΡƒΠ΄ΠΈΠΌΠ΅Π½Ρ‚ ΠΏΡ€Π΅ΠΆΠ½ΠΈΡ… вСрсий систСмы.

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

POSIX допускаСт, Ρ‡Ρ‚ΠΎ Π½Π΅ всС сигналы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, допускаСтся ситуация, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ символичСскоС имя сигнала ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Π½ΠΎ сам сигнал отсутствуСт Π² систСмС (измСнСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ вСрсии QNX ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ). Для диагностики Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ наличия сигнала ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠ΅ΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ части стандарта POSIX 1003.1: Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ сигнала сообщаСт Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sigaction() с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ act ΠΈ oact, установлСнными Π² NULL. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ тСст (Ρ„Π°ΠΉΠ» s1.cc), Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ POSIX Π² QNX 6.2.1:

#include <stdlib.h>

#include <stream.h>

#include <errno.h>

#include <signal.h>

int main(int argc, char *argv[]) {

 cout << "SIGNO";

 for (int i = _SIGMIN; i <= _SIGMAX; i++) {

  if (i % 8 == 1) cout << endl << i << ':';

  int res = sigaction(i, NULL, NULL);

  cout << '\t' << ((res != 0 && errno == EINVAL) ? '-' : '+');

 }

 cout << endl;

 return EXIT_SUCCESS;

}

И Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π³ΠΎ выполнСния:

SIGNO

1:  + + + + + + + +

9:  + + + + + + + +

17: + + + + + + + +

25: + + + + + + + +

33: + + + + + + + +

41: + + + + + + + +

49: + + + + + + + +

57: - - - - - - - -

БистСма «считаСт» всС сигналы 1…56 Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ, Π° послСдниС 8 спСцифичСских сигналов QNX, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ примСнСния ΠΊ Π½ΠΈΠΌ sigaction(). Π—Π΄Π΅ΡΡŒ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ†ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠ΅ΠΉΡΡ Π²Ρ‹ΡˆΠ΅ раскладкой сигналов QNX Π΅ΡΡ‚ΡŒ нСбольшая Π·Π°Π³Π°Π΄ΠΊΠ°: ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ POSIX-сигнала, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² <signal.h>, являСтся 31 (SIGXFSZ β€“ 31); Ρ‚Π°ΠΌ ΠΆΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΅ΡΡ‚ΡŒ Ρ„Ρ€Π°Π·Π°: «допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сигналов β€” ΠΎΡ‚ 1 Π΄ΠΎ 56, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ядром β€” ΠΎΡ‚ 57 Π΄ΠΎ 64Β». НСпонятно, Π² ΠΊΠ°ΠΊΠΎΠΌ качСствС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сигналы 32–40, нСпосрСдствСнно ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ сигналам Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (41–56) ΠΈ диагностируСмыС sigaction() ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ (valid)? ПозТС ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ систСмой Π½Π°Ρ€Π°Π²Π½Π΅ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сигналами.

Врадиционная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигнала

Π’ этой части излоТСния ΠΌΡ‹ рассмотрим Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° сигналов ΠΈ установки для Π½ΠΈΡ… собствСнных ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² (Π² Ρ‚ΠΎΠΌ числС ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ восстановлСниС стандартной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ). Π’Π΅Ρ€ΠΌΠΈΠ½ Β«Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉΒ» здСсь ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±Π΅Π³Π»ΠΎ рассмотрим ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигналов ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ процСссам ΠΈ стандартным сигналам UNIX (Π½Π΅ сигналам Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ рассматриваСтся Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΠΏΠΎ UNIX (ΠΈ здСсь сигнал воспринимаСтся, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, СдинствСнным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ прилоТСния, Π° Π½Π΅ процСссом, Π½ΠΎ Π² этом случаС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ). ПозТС ΠΌΡ‹ рассмотрим модСль ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ Π΅Π΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ прилоТСния.

«Бтарая» модСль ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала

Π’ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях UNIX Π±Ρ‹Π»Π° принята СдинствСнная модСль ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов, основанная Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal(), которая ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ сСмантику Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Β«Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… сигналов», ΠΏΡ€ΠΈΠ½ΡΡ‚ΡƒΡŽ Π² этих ОБ. ПозТС эта модСль Π±Ρ‹Π»Π° ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ΅, Π²ΡΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΉ Π΅Π΅ Β«Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒΒ». Данная модСль сохранСна для совмСстимости с Ρ€Π°Π½Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм. Она ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ сущСствСнными нСдостатками, основными ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

β€’ ΠΏΡ€ΠΎΡ†Π΅ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сигнала Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ выполнСния критичСских участков ΠΊΠΎΠ΄Π°;

β€’ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала Π΅Π³ΠΎ диспозиция устанавливаСтся Π½Π° дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… сигналов трСбуСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (Ρ„Π°ΠΉΠ» s2.cc) использования этой ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ стал ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠΌ ΠΈ ΠΊΠΎΡ‡ΡƒΠ΅Ρ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ источника Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

НСнадСТная модСль Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° сигнал

#include <iostream.h>

#include <signal.h>

#include <unistd.h>


// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала SIGINT

static void handler(int signo) {

 // Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ:

 signal(SIGINT, handler);

 cout << "ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал SYSINT" << endl;

}


int main() {

 // ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ диспозиции сигналов:

 signal(SIGINT, handler);

 signal(SIGSEGV, SIG_DFL);

 signal(SIGTERM, SIG_IGN);

 while(true) pause();

}

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

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ SIG_DFL ΠΈ SIG_IGN ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ:

#define SIG_ERR  (( void(*)(_SIG_ARGS))-1 )

#define SIG_DFL  (( void(*)(_SIG_ARGS))0)

#define SIG_IGN  (( void(*)(_SIG_ARGS))1)

#define SIG_HOLD (( void(*)(_SIG_ARGS))2)

Π³Π΄Π΅ _SIG_ARGS β€” это фактичСски Ρ‚ΠΈΠΏ int. SIG_DFL ΠΈ SIG_IGN ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ диспозиции сигнала Β«ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» ΠΈ Β«ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΒ» соотвСтствСнно, Π° ΠΎ SIG_HOLD ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ просто ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ: Π½Π° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ [Ctrl+C] ΠΎΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ сообщСниСм ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала... ΠΈ всС. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ для этого посылкой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ сигнала, Π½ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса (Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ экзСмпляра ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°). Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ PID Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ процСсса:

# pidin

...

220//86 1 /s2 10 r STOPPED

...

И посылаСм процСссу сигнал Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ:

# kill -9 2207786 ΠΈΠ»ΠΈ kill -SIGKILL 2207786

Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ kill, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы процСссам Β«ΠΈΠ·Π²Π½Π΅Β» ΠΈ Π² описываСмых Π΄Π°Π»Π΅Π΅ тСстах, Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΠΊ это происходит, Π² Ρ‚ΠΎΠΌ числС ΠΈ для сигналов Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (41…56).

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ (Ρ„Π°ΠΉΠ» s4.cc) для обСспСчСния часто Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ прСрывания выполнСния ΠΏΠΎ [Ctrl+C], Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ всС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ (ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° диск, Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, сокСты ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹):

#include <stdlib.h>

#include <iostream.h>

#include <signal.h>

#include <unistd.h>


static void handler(int signo) {

 cout << "Saving data ... wait.\r" << flush;

 sleep(2); // здСсь Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ дСйствия!

 cout << "                          " << flush;

 exit(EXIT_SUCCESS);

}


int main() {

 signal(SIGINT, handler);

 signal(SIGSEGV, SIG_DFL);

 signal(SIGTERM, SIG_IGN);

 while (true) pause();

}

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ оТидания pause() ΠΏΡ€ΠΈ поступлСнии сигналов Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ -1, Π° пСрСмСнная errno устанавливаСтся Π² EINTR. Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ (Ρ„Π°ΠΉΠ» s3.cc) нСявного (Π±Π΅Π· явной установки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²) использования сигналов:

#include <stream.h>

#include <stdlib.h>

#include <unistd.h>


int main(void) {

 alarm(5);

 cout << "Waiting to die in 5 seconds ..." << endl;

 pause();

 return EXIT_SUCCESS;

}

ΠžΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌΠ°Ρ модСль ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ рядом нСдостатков, считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ ΠΈ, Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Π½Π΅ обСспСчиваСт Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигналов. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ эту модСль достаточно ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π² простых случаях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ нСобходимости ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, устанавливаСтся Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ оТидания установлСния соСдинСния Π² TCP/IP-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ [9]:

void alarm_handler(int sig) { return; }


int main() {

 ...

 signal(SIGALRM, alarm_handler); alarm(5);

 int rc = connect( ... );

 alarm(0);

 if (rc < 0 && errno == EINTR)

 cout << "Π˜ΡΡ‚Π΅ΠΊ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚" << endl, exit(EXIT_FAILURE);

 ...

}

Π—Π΄Π΅ΡΡŒ умСстно Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, связанноС с сигналами, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ обдСляСтся Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… руководствах ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API (connect(), delay(), wait(), waitid() ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅) Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ любого сигнала. Π’Π°ΠΊΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ API, ΠΊΠ°ΠΊ pause() ΠΈ sigwait(), Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для выполнСния пассивной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° поступлСния сигнала. МногиС ΠΈΡ… Π½ΠΈΡ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π² качСствС ΠΊΠΎΠ΄Π° систСмной ошибки errno Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EINTR, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ для отраТСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΠΌ ΠΈΠ·Π²Π½Π΅ сигналом. ΠœΡ‹ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π² тСкстС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: