Что касается количества ошибок в Linux - PullRequest
5 голосов
/ 21 июля 2010

Есть ли какая-нибудь ссылка или материал, где я могу узнать больше о различных числах ошибок в Linux ??

В настоящее время в man erno я получаю по одной строке для каждого номера ошибки, но я хотел бы знать условия или шансы, при которых возникает конкретная ошибка (более подробное описание в коротких словах)

Например,

EADDRNOTAVAIL 99 /* Cannot assign requested address */

Выше ошибка возникает, когда сокет пытался привязать к IP-адресу, который не присутствует локально в машине. Точно так же для всех других ошибок есть ли вики или материал для подробной информации ??

Ответы [ 6 ]

9 голосов
/ 21 июля 2010

Что ж, поскольку при выполнении чего-либо обычно возникают ошибки, лучше всего поискать на странице man что-нибудь.

Например, если вы набрали errno из 34 от вашего fscanf() вызова, вы сначала должны сделать:

grep 34 $(find /usr/include -name '*errno*h')

чтобы выяснить, в чем была ошибка:

/usr/include/bits/errno.h:#define ERANGE 34 /* Math result not representable. */
/usr/include/asm-generic/errno-base.h:#define ERANGE 34 /* Math result not ... */

Затем, глядя на страницу man для fscanf(), вы видите:

ERANGE - The result of an integer conversion would exceed the size
         that can be stored in the corresponding integer type.

и вы (надеюсь) сможете оттуда это выяснить.

Если вы хотите получить список ошибок и (краткое) описание, измените grep выше следующим образом:

grep define $(find /usr/include -name '*errno*h') | less

и просмотрите вывод.

И, если вы до сих пор не знаете об ошибке и ее причинах (описания немного краткие, я согласен), я бы просто сунул ее (например, EADDRNOTAVAIL) в это маленькое диалоговое окно в правом верхнем углу браузера 1 , и вы получите что-то вроде this (или много других замечательных страниц):

Невозможно назначить запрошенный адрес
Вы пытаетесь bind(2) на локальный адрес, который не является локальным. Например, если IP-адреса компьютера равны 127.0.0.1 и 1.2.3.4 и вы пытаетесь привязать к 1.2.3.5, вы получите эту ошибку. Убедитесь, что адрес, с которым вы пытаетесь связать, существует на компьютере, с которого вы пытаетесь его связать.
Эта ошибка также может появиться, если вы выполняете «предварительно связанное соединение», когда вы сначала привязываетесь к локальному порту, а затем делаете исходящее соединение с сокетом. Если локальный порт уже подключен к указанному удаленному IP-адресу и порту (т. Е. Уже есть идентичная пара сокетов), вы получите эту ошибку (значение = 99 в Linux).
4 страницы ссылаются на EADDRNOTAVAIL:
- связать (2)
- подключить (2)
- setsockopt (2)
- пакет (7)

Продолжайте, попробуйте и с другими значениями ошибок, это не так уж плохо.


1 Вы используете Firefox, верно? : -)

3 голосов
/ 21 июля 2010

Коды ошибок являются довольно общими и имеют смысл только в контексте конкретной функции. Таким образом, нет большого преимущества в изучении всех кодов ошибок, так как они могут означать слегка разные вещи для разных функций и должны все равно обрабатываться по-разному.

В разделе «ОШИБКИ» на справочной странице функции будет указано, какие коды возможны для ее возвращаемых значений или errno и почему они встречаются.

0 голосов
/ 21 июля 2010

эта программа также может сделать трюк ..

#include<stdio.h>
#include<string.h>

int main()
{
        int i= 0 ;

        for ( i = 0 ; i<=132; i++ )
        {
                printf("no %d == %s \n", i , strerror(i));
        }
}
no 0 == Success
no 1 == Operation not permitted
no 2 == No such file or directory
no 3 == No such process
no 4 == Interrupted system call
no 5 == Input/output error
no 6 == No such device or address
no 7 == Argument list too long
no 8 == Exec format error
no 9 == Bad file descriptor
no 10 == No child processes
no 11 == Resource temporarily unavailable
no 12 == Cannot allocate memory
no 13 == Permission denied
no 14 == Bad address
no 15 == Block device required
no 16 == Device or resource busy
no 17 == File exists
no 18 == Invalid cross-device link
no 19 == No such device
no 20 == Not a directory
no 21 == Is a directory
no 22 == Invalid argument
no 23 == Too many open files in system
no 24 == Too many open files
no 25 == Inappropriate ioctl for device
no 26 == Text file busy
no 27 == File too large
no 28 == No space left on device
no 29 == Illegal seek
no 30 == Read-only file system
no 31 == Too many links
no 32 == Broken pipe
no 33 == Numerical argument out of domain
no 34 == Numerical result out of range
no 35 == Resource deadlock avoided
no 36 == File name too long
no 37 == No locks available
no 38 == Function not implemented
no 39 == Directory not empty
no 40 == Too many levels of symbolic links
no 41 == Unknown error 41
no 42 == No message of desired type
no 43 == Identifier removed
no 44 == Channel number out of range
no 45 == Level 2 not synchronized
no 46 == Level 3 halted
no 47 == Level 3 reset
no 48 == Link number out of range
no 49 == Protocol driver not attached
no 50 == No CSI structure available
no 51 == Level 2 halted
no 52 == Invalid exchange
no 53 == Invalid request descriptor
no 54 == Exchange full
no 55 == No anode
no 56 == Invalid request code
no 57 == Invalid slot
no 58 == Unknown error 58
no 59 == Bad font file format
no 60 == Device not a stream
no 61 == No data available
no 62 == Timer expired
no 63 == Out of streams resources
no 64 == Machine is not on the network
no 65 == Package not installed
no 66 == Object is remote
no 67 == Link has been severed
no 68 == Advertise error
no 69 == Srmount error
no 70 == Communication error on send
no 71 == Protocol error
no 72 == Multihop attempted
no 73 == RFS specific error
no 74 == Bad message
no 75 == Value too large for defined data type
no 76 == Name not unique on network
no 77 == File descriptor in bad state
no 78 == Remote address changed
no 79 == Can not access a needed shared library
no 80 == Accessing a corrupted shared library
no 81 == .lib section in a.out corrupted
no 82 == Attempting to link in too many shared libraries
no 83 == Cannot exec a shared library directly
no 84 == Invalid or incomplete multibyte or wide character
no 85 == Interrupted system call should be restarted
no 86 == Streams pipe error
no 87 == Too many users
no 88 == Socket operation on non-socket
no 89 == Destination address required
no 90 == Message too long
no 91 == Protocol wrong type for socket
no 92 == Protocol not available
no 93 == Protocol not supported
no 94 == Socket type not supported
no 95 == Operation not supported
no 96 == Protocol family not supported
no 97 == Address family not supported by protocol
no 98 == Address already in use
no 99 == Cannot assign requested address
no 100 == Network is down
no 101 == Network is unreachable
no 102 == Network dropped connection on reset
no 103 == Software caused connection abort
no 104 == Connection reset by peer
no 105 == No buffer space available
no 106 == Transport endpoint is already connected
no 107 == Transport endpoint is not connected
no 108 == Cannot send after transport endpoint shutdown
no 109 == Too many references: cannot splice
no 110 == Connection timed out
no 111 == Connection refused
no 112 == Host is down
no 113 == No route to host
no 114 == Operation already in progress
no 115 == Operation now in progress
no 116 == Stale NFS file handle
no 117 == Structure needs cleaning
no 118 == Not a XENIX named type file
no 119 == No XENIX semaphores available
no 120 == Is a named type file
no 121 == Remote I/O error
no 122 == Disk quota exceeded
no 123 == No medium found
no 124 == Wrong medium type
no 125 == Operation canceled
no 126 == Required key not available
no 127 == Key has expired
no 128 == Key has been revoked
no 129 == Key was rejected by service
no 130 == Owner died
no 131 == State not recoverable
no 132 == Unknown error 132
0 голосов
/ 21 июля 2010

Как предлагали другие авторы, лучшим источником для расшифровки того, что ошибки действительно означают в контексте, является соответствующая справочная страница. Для сетевых протоколов подходящая страница руководства может быть чем-то отличным от системного вызова; для IP-сокетов попробуйте ip (7), который дает чуть больше информации:

   EADDRNOTAVAIL
          A nonexistent interface was requested or  the  requested  source
          address was not local.

Дополнительные коды ошибок описаны в tcp (7) и udp (7).

0 голосов
/ 21 июля 2010

Если это GLIBC, попробуйте использовать %m в выражении printf ():

#include <errno.h>
...
int fh = fopen(...);
if (0 > fh) printf("Couldn't open the file: %d, %m\n", errno);

Очень полезно.

0 голосов
/ 21 июля 2010

Его API-специфика. Я не слышал об общем списке ошибок. Однако:

Many functions provide an error number in errno, which has type int
and is defined in <errno.h>.

Так что вы можете взглянуть на заголовочный файл errno.h . Точно так же Glib имеет разные коды для сообщения об ошибках.

EDIT: Хорошо, если вы уже знаете код ошибки, тогда вы всегда можете получить дополнительную информацию об этой ошибке в Google, если вы найдете справочную страницу неудовлетворительной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...