Иногда (например, используя strace
, gdb
и т. Д.) Обнаруживается, что вызов POSIX устанавливает errno
в целочисленное значение, и нужно знать константу C времени компиляции (более точно определение препроцессора), чтобы проверить ее (например, ECHILD
) - см., Например, waitpid для дочернего процесса не выполняется.
Например, в приведенном выше вопросе целочисленный номер ошибки 10
был возвращен в errno
. Я хочу вернуться от этого к строке ECHILD
. Не то, что perror
или strerror
дали бы мне («Никаких дочерних процессов» или подобное).
Вот очевидный способ сделать это, но он не работает:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char **argv)
{
printf ("%s\n", strerror (10));
exit (0);
}
Это печатает вывод:
No child processes
не ECHILD
, следовательно, не делает требуемого.
Есть ли более простой способ сделать это, чем несколько ручное руководство с grep
по /usr/include
?
Вы можете подумать, что это дубликаты, но на самом деле это не так:
Как преобразовать errno в UNIX в соответствующую строку? - говорит
strerror
(очевидно) преобразует целое число в удобочитаемую строку, аperror
печатает его. Я не хочу этого делать. Я хочу напечатать символьный эквивалент, т.е. определение препроцессора, которое можно использовать для проверки этогоerrno
.Linux, преобразовать errno в имя - ближе, но ищет вызов API. Ясно, что их нет. В принятом ответе также неверно указано, что ошибки находятся в
errno.h
- в моей системе они распределены между несколькими файлами, что делает поиск более интересным. Как распечатать символическое имя ошибка в C? аналогична.
Соответствующий ответ может включать некоторую магию для предварительной обработки соответствующих частей /usr/include
и отображения любых констант, начинающихся с E
, с соответствующим значением.