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

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

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

МногиС систСмы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния ошибок, Π° Π² Π±ΠΎΠ»Π΅Π΅ старых систСмах ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ всСх пСрСчислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ошибок. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ справочных страниц 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
' ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

$ <b>ulimit -n</b>

1024

Из Π‘ максимальноС число ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ

getdtablesize()
(ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ дСскрипторов):

#include &lt;unistd.h&gt; /* ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ */

int getdtablesize(void);

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

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