"Иногда, когда адрес ошибки равен 0, код ошибки равен 23. Что
23 значит? "
Если вы начнете с источника сигнала для arm в / arch / arm / kernel / signal.h , вы обнаружите, что структура определена в / arch / arm / include / uapi / asm /sigcontext.h
И тогда вы найдете error_code
, определенный как unsigned long
в struct sigcontext
, например,
struct sigcontext {
unsigned long trap_no;
unsigned long error_code;
unsigned long oldmask;
unsigned long arm_r0;
unsigned long arm_r1;
unsigned long arm_r2;
unsigned long arm_r3;
unsigned long arm_r4;
unsigned long arm_r5;
unsigned long arm_r6;
unsigned long arm_r7;
unsigned long arm_r8;
unsigned long arm_r9;
unsigned long arm_r10;
unsigned long arm_fp;
unsigned long arm_ip;
unsigned long arm_sp;
unsigned long arm_lr;
unsigned long arm_pc;
unsigned long arm_cpsr;
unsigned long fault_address;
};
( примечание: структура отличается для arm64
)
Затем, чтобы узнать номер ошибки (errno
) 23
, вы должны начать с / arch / arm / kernel / signal.c и увидеть, что linux/errno.h
включена, и следовать след к / include / linux / errno.h , который ведет вас к / include / uapi / asm-generic / errno.h и, наконец, ведет к / include /uapi/asm-generic/errno-base.h
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H
#define EPERM 1 /* Operation not permitted */
...
#define ENFILE 23 /* File table overflow */
...
( примечание: первые 38 кодов ошибок являются общими для всех процессов и архитектур, хотя некоторые не могут встречаться на определенных архитектурах. Таким образом, причина, по которой они находятся в определении _ASM_GENERIC_ERRNO_BASE_H
)
Который затем вы можете использовать для общего поиска, например man 3 errno , который объясняет:
ENFILE Too many open files in system (POSIX.1-2001). On
Linux, this is probably a result of encountering the
/proc/sys/fs/file-max limit (see proc(5)).
Вы также можете обратиться к документации libc
Коды ошибок , чтобы найти:
Macro: int ENFILE
“Too many open files in system.” There are too many distinct file
openings in the entire system. Note that any number of linked
channels count as just one file opening; see Linked Channels. This
error never occurs on GNU/Hurd systems.
Обе из этих проблем ясно указывают на то, что "слишком много открытых файлов в системе" . Теперь вам нужно выяснить, почему это происходит в вашем коде.
( примечание: в качестве ярлыка, который вы можете просто найти, например, "linux error 23"
, из которого вы найдете необходимую информацию, например, Ошибки: системные ошибки Linux , но не Делая обратную трассировку, обратите пристальное внимание на то, сколько лет информации о местонахождении файла, поскольку errno
теперь может находиться в совершенно ином месте дерева, чем то, что указано на старых страницах - как в случае с ссылка выше)