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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 89

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

#include <unistd.h> /* GLIBC */


long int TEMP_FAILURE_RETRY(expression);

Π’ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макроса:

/* ΠžΡ†Π΅Π½ΠΈΡ‚ΡŒ EXPRESSION ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 с 'errno',

    установлСнным Π² EINTR. */

# define TEMP_FAILURE_RETRY(expression) \

 (__extension__ \

  ({ long int __result; \

   do __result = (long int)(expression); \

   while (__result == -1L && errno == EINTR); \

   __result; }))

ΠœΠ°ΠΊΡ€ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ GCC ΠΊ языку Π‘ (ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом __extension__), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ допускаСт Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… скобок выраТСниям Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, дСйствуя Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ простому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот макрос, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ safe_read() ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

size_t safe_read(int fd, void const *buf, size_t count) {

 ssize_t result;

 /* ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ count, ΠΊΠ°ΠΊ Π² Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. */

 if (count > INT_MAX)

  count = INT_MAX & ~8191;

 result = TEMP_FAILURE_RETRY(read(fd, buf, count));

 return (size_t)result;

}

10.4.5. Бостояния Π³ΠΎΠ½ΠΎΠΊ ΠΈ sig_atomic_t (ISO C)

Пока ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала Π·Π° Ρ€Π°Π· выглядит просто: установка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала Π² main() ΠΈ (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ) пСрСустановка самого сСбя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала (ΠΈΠ»ΠΈ установка дСйствия SIG_IGN) Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ дСйствия ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Но Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ Π΄Π²Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… сигнала, ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ? Π’ частности, Ρ‡Ρ‚ΠΎ, Ссли ваша систСма восстановит дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для вашСго сигнала, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ сигнал появится послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, Π½ΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ сСбя восстановит?

Или ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ bsd_signal(), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ остаСтся установлСнным, Π½ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ сигнал отличаСтся ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сигнала Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ запускаСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ сигналы!

Оба случая относятся ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π³ΠΎΠ½ΠΊΠΈ. Одним Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ являСтся ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большСС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, создав Ρ„Π»Π°Π³ΠΎΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° появлСниС сигнала. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала устанавливаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² true ΠΈ возвращаСтся. Π—Π°Ρ‚Π΅ΠΌ основная Π»ΠΎΠ³ΠΈΠΊΠ° провСряСт Ρ„Π»Π°Π³ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² стратСгичСских мСстах:

int sig_int_flag = 0; /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала устанавливаСт Π² true */


void int_handler(int signum) {

 sig_int_flag = 1;

}


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

 bsd_signal(SIGINT, int_handler);

 /* ...ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° продолТаСтся... */

 if (sig_int_flag) {

  /* Π²ΠΎΠ·Π½ΠΈΠΊ SIGINT, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ */

 }

 /* ...ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ°... */

}

(ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта стратСгия ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ уязвимости, Π½ΠΎ Π½Π΅ устраняСт Π΅Π³ΠΎ).

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Π‘ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ β€” sig_atomic_t β€” для использования с Ρ‚Π°ΠΊΠΈΠΌΠΈ Ρ„Π»Π°Π³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. ИдСя, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°ΡΡΡ Π·Π° этим ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ присвоСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ этого Ρ‚ΠΈΠΏΠ° являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ: Ρ‚.Π΅. ΠΎΠ½ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ Π΄Π΅Π»ΠΈΠΌΠΎΠ΅ дСйствиС. НапримСр, Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ машин присвоСниС значСния int осущСствляСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ инициализация Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² структурС осущСствляСтся Π»ΠΈΠ±ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ копирования всСх Π±Π°ΠΉΡ‚ΠΎΠ² Π² (сгСнСрированном компилятором) Ρ†ΠΈΠΊΠ»Π΅, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции Β«Π±Π»ΠΎΡ‡Π½ΠΎΠ³ΠΎ копирования», которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ присвоСниС значСния sig_atomic_t являСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ, Ρ€Π°Π· Π½Π°Ρ‡Π°Π²ΡˆΠΈΡΡŒ, ΠΎΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сигнал ΠΈ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

НаличиС особого Ρ‚ΠΈΠΏΠ° являСтся лишь Ρ‡Π°ΡΡ‚ΡŒΡŽ истории. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ sig_atomic_t Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ volatile:

volatile sig_atomic_t sig_int_flag = 0; /* ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала устанавливаСт Π² true */

/* ...ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Ρ€Π°Π½ΡŒΡˆΠ΅... */

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile сообщаСт компилятору, Ρ‡Ρ‚ΠΎ пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΈΠ·Π²Π½Π΅, Π·Π° спиной компилятора, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ позволяСт компилятору ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, которая ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ прилоТСния ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… sig_atomic_t Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΠΎ. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ обращСния с сигналами ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π°Π»Π΅Π΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.7 Β«Π‘ΠΈΠ³Π½Π°Π»Ρ‹ для мСТпроцСссного взаимодСйствия».

10.4.6. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдостСрСТСния

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX прСдусматриваСт для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов нСсколько прСдостСрСТСний:

β€’ Π§Ρ‚ΠΎ случаСтся, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для SIGFPE, SIGILL, SIGSEGV ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… сигналов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Β«Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ», Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ.

β€’ Π•сли ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° abort(), raise() ΠΈΠ»ΠΈ kill(), ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ raise(). abort() описана Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 12.4 Β«Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ самоубийства: abort()Β», a kill() описана Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅. (Описанная Π΄Π°Π»Π΅Π΅ функция API sigaction() с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом, Ссли это ΠΈΠΌΠ΅Π΅Ρ‚ мСсто.)

β€’ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ лишь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Ρ‚Π°Π±Π». 10.2. Π’ частности, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ <stdio.h>. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ <stdio.h> ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ находится Π² сСрСдинС процСсса обновлСния. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ <stdio.h> ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС.

Бписок Π² Ρ‚Π°Π±Π». 10.2 происходит ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 2.4 Ρ‚ΠΎΠΌΠ° System Interfaces (БистСмныС интСрфСйсы) стандарта POSIX 2001. МногиС ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ относятся ΠΊ слоТному API ΠΈ большС Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅.


Π’Π°Π±Π»ΠΈΡ†Π° 10.2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала

_Exit() fpathconf() raise() sigqueue() _exit() fstat() read() sigset() accept() fsync() readlink() sigsuspend() access() ftruncate() recv() sleep() aio_error() getegid() recvfrom() socket() aio_return() geteuid() recvmsg() socketpair() aio_suspend() getgid() rename() stat() alarm() getgroups() rmdir() sysmlink() bind() getpeername() select() sysconf() cfgetispeed() getpgrp() sem_post() tcdrain() cfgetospeed() getpid() send() tcflow() cfsetispeed() getppid() sendmsg() tcflush() cfsetospeed() getsockname() sendto() tcgetattr() chdir() getsockopt() setgid() tcgetpgrp() chmod() getuid() setpgid() tcsendbreak() chown() kill() setsid() tcsetattr() clock_gettime() link() setsockopt() tcsetpgrp() close() listen() setuid() time() connect() lseek() shutdown() timer_getoverrun() creat() lstat() sigaction() timer_gettime() dup() mkdir() sigaddset() timer_settime() dup2() mkfifo() sigdelset() times() execle() open() sigemptyset() umask() execve() pathconf() sigfillset() uname() fchmod() pause() sigismember() unlink() fchown() pipe() signal() utime() fcntl() poll() sigpause() wait() fdatasync() posix_trace_event() sigpending() waitpid() fork() pselect() sigprocmask() write()

10.4.7. Наша история Π΄ΠΎ настоящСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, эпизод 1