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

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

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

МногиС систСмы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния ошибок, Π° Π² Π±ΠΎΠ»Π΅Π΅ старых систСмах ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ всСх пСрСчислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ошибок. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ справочных страниц intro(2) ΠΈ errno(2) для локальной систСмы.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. errno слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ лишь послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сдСланы дальнСйшиС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ 0. Однако, Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ°Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ошибками Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ измСняСт Π΅Π΅ значСния, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ² Π½Π΅ восстанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ Π² 0 Π² самом Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ это дСлаСтся Ρ€Π΅Π΄ΠΊΠΎ.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ errno лишь для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Для этого ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ β€” perror():

#include <stdio.h> /* ISO Π‘ */


void perror(const char *s);

Ѐункция perror() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ строку, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ строка, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ errno:

if (some_system_call(param1, param2) < 0) {

 perror("system call failed");

 return 1;

}

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strerror(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ошибки ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку с описаниСм ошибки:

#include <string.h> /* ISO Π‘ */


char *strerror(int errnum);

strerror() прСдоставляСт для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ fprintf() Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ошибки Π»ΡŽΠ±Ρ‹ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π½Π°ΠΌ способом, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ этого.

if (some_system_call(param1, param2) < 0) {

 fprintf(stderr, "%s: %d, %d: some_system_call failed: %s\n",

  argv[0], param1, param2, strerror(errno));

 return 1;

}

По всСй ΠΊΠ½ΠΈΠ³Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

4.3.2. Π‘Ρ‚ΠΈΠ»ΡŒ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

Для использования Π² сообщСниях ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π‘ прСдоставляСт нСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… макросов. НаиболСС ΡˆΠΈΡ€ΠΎΠΊΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ __FILE__ ΠΈ __LINE__, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² имя исходного Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки Π² этом Ρ„Π°ΠΉΠ»Π΅. Π’ Π‘ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ доступны с самого Π½Π°Ρ‡Π°Π»Π°. C99 опрСдСляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, __func__, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ символьной строки. ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

if (some_system_call(param1, param2) < 0) {

 fprintf(stderr, "%s: %s (%s %d): some_system_call(%d, %d) failed: %s\n",

  argv[0], __func__, __FILE__, __LINE__,

  param1, param2, strerror(errno));

 return 1;

}

Π—Π΄Π΅ΡΡŒ сообщСниС ΠΎΠ± ошибкС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, имя исходного Ρ„Π°ΠΉΠ»Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ строки. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… для диагностики, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 4.2.


Π’Π°Π±Π»ΠΈΡ†Π° 4.2. ДиагностичСскиС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ C99

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ВСрсия Π‘ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ __DATE__ C89 Π”Π°Ρ‚Π° компиляции Π² Π²ΠΈΠ΄Π΅ Β«Mmm nn yyyyΒ» __FILE_ ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ Имя исходного Ρ„Π°ΠΉΠ»Π° Π² Π²ΠΈΠ΄Π΅ Β«program.cΒ» __LINE__ ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ НомСр строки исходного Ρ„Π°ΠΉΠ»Π° Π² Π²ΠΈΠ΄Π΅ 42 __TIME__ C89 ВрСмя компиляции Π² Π²ΠΈΠ΄Π΅ Β«hh:mm:ssΒ» __func__ C99 Имя Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π±Ρ‹Π»ΠΎ объявлСно const char __func__[] = "name"

ИспользованиС __FILE__ ΠΈ __LINE__ Π±Ρ‹Π»ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ для Ρ€Π°Π½Π½ΠΈΡ… Π΄Π½Π΅ΠΉ Unix, ΠΊΠΎΠ³Π΄Π° Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° людСй Π±Ρ‹Π»ΠΈ исходныС ΠΊΠΎΠ΄Ρ‹ ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ошибки ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΡ…. По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ систСмы Unix ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ всС Π±ΠΎΠ»Π΅Π΅ коммСрчСскими, использованиС этих ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² постСпСнно ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π»ΠΎΡΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Π½ΠΈΠ΅ полоТСния Π² исходном ΠΊΠΎΠ΄Π΅ Π΄Π°Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·Ρ‹, ΠΊΠΎΠ³Π΄Π° имССтся лишь Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ».

БСгодня, хотя систСмы GNU/Linux ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с исходными ΠΊΠΎΠ΄Π°ΠΌΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ часто Π½Π΅ устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ использованиС этих ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² для сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π½Π΅ прСдставляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ цСнности. GNU Coding Standards Π΄Π°ΠΆΠ΅ Π½Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΈΡ….

4.4. Π’Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Linux ΠΏΠΎ Π²Π²ΠΎΠ΄Ρƒ/Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ посрСдством дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ². Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π» Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ с дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ², описываСт, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄.

4.4.1. ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ ΠΎ дСскрипторах Ρ„Π°ΠΉΠ»ΠΎΠ²

ДСскриптор Ρ„Π°ΠΉΠ»Π° являСтся Ρ†Π΅Π»Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0 ΠΈ растут Π΄ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ установлСнного систСмой ΠΏΡ€Π΅Π΄Π΅Π»Π°. Π­Ρ‚ΠΈ Ρ†Π΅Π»Ρ‹Π΅ фактичСски ΡΠ²Π»ΡΡŽΡ‚ΡΡ индСксами Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса (Π’Π°Π±Π»ΠΈΡ†Π° поддСрТиваСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы; ΠΎΠ½Π° нСдоступна Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ.) Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ соврСмСнных систСм Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ† большиС. Команда 'ulimit -n' ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

$ ulimit -n

1024

Из Π‘ максимальноС число ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ getdtablesize() (ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ дСскрипторов):

#include <unistd.h> /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ */


int getdtablesize(void);

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ нСбольшая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

/* ch04-maxfds.с --- ДСмонстрация getdtablesize(). */

#include <stdio.h> /* для fprintf(), stderr, BUFSIZ */

#include <unistd.h> /* для ssize_t */


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

 printf("max fds: %d\n", getdtablesize());

 exit(0);

}

ΠΠ΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ послС компиляции ΠΈ запуска эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ ulimit:

$ ch04-maxfds

max fds: 1024

ДСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² содСрТатся Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… int; для использования с систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ объявлСния Π²ΠΈΠ΄Π° 'int fd'. Для дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ случаС каТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ с трСмя ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ для Π½Π΅Π΅ дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΎ стандартный Π²Π²ΠΎΠ΄, стандартный Π²Ρ‹Π²ΠΎΠ΄ ΠΈ стандартная ошибка, с дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ² 0, 1 ΠΈ 2 соотвСтствСнно. (Если Π½Π΅ Π±Ρ‹Π»ΠΎ использовано ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… связан с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΈ с экраном.)

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ символичСскиС константы. ΠžΠΊΡΡŽΠΌΠΎΡ€ΠΎΠ½?

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Π½Π° основС дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ стандартных Π²Π²ΠΎΠ΄Π°, Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ошибки Ρ†Π΅Π»Ρ‹Π΅ константы 0, 1 ΠΈ 2 ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ прямо Π² ΠΊΠΎΠ΄Π΅. Π’ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв использованиС Ρ‚Π°ΠΊΠΈΡ… символичСских констант (manifest constants) являСтся ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΌΡ‹ΡΠ»ΡŒΡŽ. Π’Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΎΠ²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ случайной Ρ†Π΅Π»ΠΎΠΉ константы ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΊ Π½Π΅ΠΉ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ константа с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, использованная Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ части ΠΊΠΎΠ΄Π°. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ стандарт POSIX Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ константы (symbolic constants) Π² <unistd.h>:

STDIN_FILENO  Β«ΠΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°Β» для стандартного Π²Π²ΠΎΠ΄Π°: 0.

STDOUT_FILENO ΠΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° для стандартного Π²Ρ‹Π²ΠΎΠ΄Π°: 1.

STDERR_FILENO ΠΠΎΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° для стандартной ошибки: 2.

Однако, ΠΏΠΎ Π½Π°ΡˆΠ΅ΠΌΡƒ скромному мнСнию, использованиС этих макросов ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, нСприятно Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ 12 ΠΈΠ»ΠΈ 13 символов вмСсто 1. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, использованиС 0, 1 ΠΈ 2 Ρ‚Π°ΠΊ стандартно ΠΈ Ρ‚Π°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстно, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… оснований для ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ Π² смыслС этих ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… символичСских констант.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, использованиС этих констант Π½Π΅ оставляСт сомнСний Π² намСрСниях программиста. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅:

int fd = 0;

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ fd Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ стандартного Π²Π²ΠΎΠ΄Π°, ΠΈΠ»ΠΈ ΠΆΠ΅ программист Π±Π»Π°Π³ΠΎΡ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ свои ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ подходящим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ? Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ этого ΡΠΊΠ°Π·Π°Ρ‚ΡŒ.

Один ΠΈΠ· ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ² (Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π”ΠΆΠ΅Ρ„Ρ„ΠΎΠΌ КольС (Geoff Collyer)) Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ опрСдСлСния enum:

enum { Stdin, Stdout, Stderr };

Π—Π°Ρ‚Π΅ΠΌ эти константы ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто 0, 1 ΠΈ 2. Π˜Ρ… Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ.

4.4.2. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²

НовыС дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ (наряду с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ источниками) Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ систСмного Π²Ρ‹Π·ΠΎΠ²Π° open(). Π­Ρ‚ΠΎΡ‚ систСмный Π²Ρ‹Π·ΠΎΠ² ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» для чтСния ΠΈΠ»ΠΈ записи ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор Ρ„Π°ΠΉΠ»Π° для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с этим Ρ„Π°ΠΉΠ»ΠΎΠΌ. ΠœΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ объявлСниС Ρ€Π°Π½ΡŒΡˆΠ΅:

#include <sys/types.h> /* POSIX */