OpenGroup POSIX.1-2001 определяет strerror_r, как и Стандартная базовая базовая спецификация Linux 3.1 < / а>. Но я не могу найти ссылки на максимальный размер, который можно было бы разумно ожидать для сообщения об ошибке. Я ожидал, что где-нибудь будет определено, что я мог бы вставить в свой код, но я не смог найти ничего.
Код должен быть потокобезопасным. Вот почему используется strerror_r, а не strerror.
Кто-нибудь знает, какой символ я могу использовать? Я должен создать свой собственный?
Пример
int result = gethostname(p_buffy, size_buffy);
int errsv = errno;
if (result < 0)
{
char buf[256];
char const * str = strerror_r(errsv, buf, 256);
syslog(LOG_ERR,
"gethostname failed; errno=%d(%s), buf='%s'",
errsv,
str,
p_buffy);
return errsv;
}
Из документов:
Базовые спецификации Open Group, выпуск 6:
ОШИБКИ
Функция strerror_r () может завершиться ошибкой, если:
- [ERANGE] Недостаточно памяти для хранения сгенерированной строки сообщения через strerrbuf и buflen.
Из источника:
glibc-2.7 / glibc-2.7 / строка / strerror.c: 41:
char *
strerror (errnum)
int errnum;
{
...
buf = malloc (1024);
strerror
вы можете использовать _ 2_ со спецификатором%m
(который является POSIX-compliant). Пример:syslog(LOG_ERR, "Error occured, details: %m")
. Чтобы узнать больше, прочтите руководствоsyslog
. К сожалению, я не знаю, является ли%m
потокобезопасным, поскольку _7 _ есть. - person patryk.beza   schedule 18.09.2016