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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 5

Автор Уильям БтивСнс

1.6. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ

Π’ любой Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈ любом Π²Ρ‹Π·ΠΎΠ²Π΅ трСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибки. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибок Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ объСм тСкста, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ (wrapper functions), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ собствСнно Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибок. Π’ соотвСтствии с соглашСниями ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ самих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹, которая дСлаСтся Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Sem_post(ptr);

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 1.1[1] 

Листинг 1.1. Ѐункция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_post

// lib/wrapunix.c

387 void

388 Sem_post(sem_t *sem)

389 {

390  if (sem_post(sem) == –1)

391   err_sys("sem_post error");

392 }

Если Π² тСкстС Π²Ρ‹ встрСтитС имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹, Π·Π½Π°ΠΉΡ‚Π΅: это наша собствСнная функция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°. Она Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ со строчной Π±ΡƒΠΊΠ²Ρ‹. Ѐункция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ сообщСния ΠΎΠ± ошибкС, Ссли таковая Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚.

ΠŸΡ€ΠΈ описании исходного ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠ½ΠΈΠ³Ρƒ, ΠΌΡ‹ всСгда Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ самого Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, sem_post), Π° Π½Π΅ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Sem_post). Аналогично Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ ΠΈΠΌΠ΅Π½Π° самих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π½Π΅ ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ ΠΊ Π½ΠΈΠΌ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ исходного ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ всСм тСкстС. ВсС нСпустыС строки Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ. ВСкст, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΊΠΎΠ΄Π°, начинаСтся с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ послСднСй строк Π½Π° пустом ΠΏΠΎΠ»Π΅ слСва. Иногда ΠΏΠ΅Ρ€Π΅Π΄ Π°Π±Π·Π°Ρ†Π΅ΠΌ тСкста присутствуСт ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π½Π°Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ, ΠΈΠ·Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ основноС содСрТаниС описываСмого ΠΊΠΎΠ΄Π°.

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠΎΠ΄Π° указываСтся имя исходного Ρ„Π°ΠΉΠ»Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” это Ρ„Π°ΠΉΠ» wrapunix.c Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ lib. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ исходный ΠΊΠΎΠ΄ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² этой ΠΊΠ½ΠΈΠ³ΠΈ распространяСтся свободно (см. прСдисловиС), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ». ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ особСнно ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² процСссС чтСния ΠΊΠ½ΠΈΠ³ΠΈ β€” Π»ΡƒΡ‡ΡˆΠΈΠΉ способ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ взаимодСйствия процСссов.

Π₯отя ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π½Π΅ слишком Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ, Π²Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ этого заблуТдСния Π² Π³Π»Π°Π²Π΅ 7, Π³Π΄Π΅ ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ (thread functions) Π½Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стандартной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Unix errno ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки; вмСсто этого ΠΊΠΎΠ΄ ошибки просто возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² Π½Π΅ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno Ρ€Π°Π²Π½Ρ‹ΠΌ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ err_sys (листинг Π’.4). Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ тСкст Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹ΠΌΠΈ скобками, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ языка Π‘ΠΈ «запятая» (comma) ΠΈ совмСщаСм присваиваниС значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno ΠΈ Π²Ρ‹Π·ΠΎΠ² err_sys Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅, ΠΊΠ°ΠΊ Π² Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

int n;

if ((n = pthread_mutex_lock(&ndone_mutex))!=0) errno=n, err_sys("pthread_mutex_lock error");

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ являСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ΄ ошибки Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, записав

Pthread_mutex_lock(&ndone_mutex);

Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ наша собствСнная функция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°, привСдСнная Π² листингС 1.2.

Листинг 1.2. РСализация ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_lock

//lib/wrappthread.c

125 void

126 Pthread_mutex_lock(pthread_mutex_t *mptr)

127 {

128  int n;

129  if ((n=pthread_mutex_lock(mptr))==0)

130   return;

131  errno=n;

132  err_sys("pthread_mutex_lock error");

133 }

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Аккуратно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ возмоТности языка Π‘ΠΈ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ макросы вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎ Π±Ρ‹ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Ρ€Π΅Π΄ΠΊΠΎ Π±Ρ‹Π²Π°ΡŽΡ‚ (Ссли Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±Ρ‹Π²Π°ΡŽΡ‚) ΡƒΠ·ΠΊΠΈΠΌ мСстом.

НашС соглашСниС ΠΎ Π·Π°ΠΌΠ΅Π½Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π·Π°Π³Π»Π°Π²Π½ΡƒΡŽ являСтся компромиссом. Π Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΎΡΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌ записи: использованиС прСфикса Π΅ ([10, с. 182]), суффикса _Π΅ ΠΈ Ρ‚. Π΄. Наш Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ каТСтся Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π°ΡŽΡ‰ΠΈΠΌ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ вызываСтся какая-Ρ‚ΠΎ другая функция.

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ свойство: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ошибки, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ функциями, ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ игнорируСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ close ΠΈ pthread_ mutex_lock.

Π”Π°Π»Π΅Π΅ Π² тСкстС ΠΊΠ½ΠΈΠ³ΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ потрСбуСтся явно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибки ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса. ΠœΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π² ΠΊΠ½ΠΈΠ³Π΅ исходный ΠΊΠΎΠ΄ для всСх ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΠΊ, Π½ΠΎ ΠΎΠ½ свободно доступСн Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ (см. прСдисловиС).

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno

ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Unix глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno присваиваСтся ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° Ρ‚ΠΈΠΏ ошибки; ΠΏΡ€ΠΈ этом функция ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ –1. Наша функция err_sys Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΊΠΎΠ΄Ρƒ ошибки сообщСниС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Resource temporarily unavailable β€” рСсурс Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСдоступСн, β€” Ссли пСрСмСнная errno ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ EAGAIN).

Ѐункция присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки. Π’ случаС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ. ВсС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ константам с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΠ· Π·Π°Π³Π»Π°Π²Π½Ρ‹Ρ… Π±ΡƒΠΊΠ², Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ с Π•, опрСдСляСмым ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <sys/errno.h>. ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽ ошибок соотвСтствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. 

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ собствСнная пСрСмСнная errno. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ происходит автоматичСски, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания компилятору Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ЗадаСтся это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ –D_REENTRANT ΠΈΠ»ΠΈ –D_POSIX_C_SOURCE=199506L ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ…. Часто Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ <errno.h> пСрСмСнная errno опрСдСляСтся ΠΊΠ°ΠΊ макрос, раскрываСмый Π² Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° константа _REENTRANT. Ѐункция обСспСчиваСт доступ ΠΊ ΠΊΠΎΠΏΠΈΠΈ errno, относящСйся ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ.

Π”Π°Π»Π΅Π΅ Π² тСкстС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ выраТСния Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ «функция mq_send Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ EMSGSIZEΒ», ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ этом Ρ€Π°Π²Π½ΠΎ –1) ΠΈ присваиваСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ константы.

1.7. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ Unix

Π’ настоящСС врСмя стандарты Unix ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Posix ΠΈ The Open Group.

Posix

НазваниС Posix ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ ΠΎΡ‚ Β«Portable Operating System InterfaceΒ», Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ «интСрфСйс пСрСносимых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм». Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ΄ΠΈΠ½ стандарт, Π° Ρ†Π΅Π»ΠΎΠ΅ сСмСйство, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ Π˜Π½ΡΡ‚ΠΈΡ‚ΡƒΡ‚ΠΎΠΌ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΏΠΎ элСктротСхникС ΠΈ радиоэлСктроникС (Institute for Electrical and Electronics Engineers β€” IEEE). Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ Posix Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ приняты Π² качСствС ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Ρ… стандартов ISO (International Organization for Standardization, ΠœΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Π°Ρ организация ΠΏΠΎ стандартизации) ΠΈ IEC (International Electrotechnical Commission, ΠœΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Π°Ρ элСктротСхничСская комиссия), ΠΈΠ»ΠΈ ISO/IEC. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ Posix ΠΏΡ€ΠΎΡˆΠ»ΠΈ нСсколько стадий Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

β–  Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ IEEE 1003.1-1988 (317 страниц) Π±Ρ‹Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ стандартом Posix. Он опрСдСлял интСрфСйс взаимодСйствия языка Π‘ с ядром Unix-Ρ‚ΠΈΠΏΠ° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… областях: ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ процСссов (Π²Ρ‹Π·ΠΎΠ²Ρ‹ fork, exec, сигналы ΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹), срСда процСсса (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π³Ρ€ΡƒΠΏΠΏΡ‹ процСссов), Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ (всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°), Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ, Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… систСмы (Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ), Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π°Ρ€Ρ…ΠΈΠ²ΠΎΠ² tar ΠΈ cpio.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ стандарт Posix Π²Ρ‹ΡˆΠ΅Π» Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ IEEEIX Π² 1986 Π³ΠΎΠ΄Ρƒ. НазваниС Posix Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Π¨Ρ‚ΠΎΠ»ΠΌΠ°Π½ΠΎΠΌ (Richard Stallman). 

β–  Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅Π» стандарт IEΠ•Π• 1003.1-1990 (356 страниц). Он ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ являлся ΠΈ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ стандартом ISO/IEC 9945-1:1990. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с вСрсиСй 1988 Π³ΠΎΠ΄Π° измСнСния Π² вСрсии 1990 Π³ΠΎΠ΄Π° Π±Ρ‹Π»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. К Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ: Β«Part 1: System Application Program Interface (API) [C Language]Β» (Β«Π§Π°ΡΡ‚ΡŒ 1: БистСмный интСрфСйс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (API) [Π―Π·Ρ‹ΠΊ Π‘])Β», ΠΈ это ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ стандарт описывал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс (API) языка Π‘. 

β–  IEEE 1003.2-1992 Π²Ρ‹ΡˆΠ΅Π» Π² Π΄Π²ΡƒΡ… Ρ‚ΠΎΠΌΠ°Ρ… ΠΎΠ±Ρ‰ΠΈΠΌ объСмом ΠΎΠΊΠΎΠ»ΠΎ 1300 страниц, ΠΈ Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ содСрТал строку Β«Part 2: Shell and UtilitiesΒ» (Π§Π°ΡΡ‚ΡŒ 2: Β«Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹Β»). Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ опрСдСляла ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ (основанный Π½Π° Bourne shell Π² Unix System V) ΠΈ ΠΎΠΊΠΎΠ»ΠΎ ста ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° β€” ΠΎΡ‚ awk ΠΈ basename Π΄ΠΎ vi ΠΈ уасс). Π’ настоящСй ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° этот стандарт ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Posix. 2.

β–  IEEE 1003.1b-1993 (590 страниц) ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» извСстСн ΠΊΠ°ΠΊ IEEE P1003.4. Π­Ρ‚ΠΎΡ‚ стандарт прСдставлял собой Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ стандарту 1003.1-1990 ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Π 1003.4: ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ², асинхронный Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄, сСмафоры, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполнСния (scheduling), часы, Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний.