вот в мане написанно что errno можно сформировать строку с помощью strerror а не ковырять по case'ам , char * который возвращает strerror нужно free после использования или нет?
неа, strerror возвращает указатель на свой внутренний статический буффер(отсюда проблемы с thread-safety), strerror_r - использует тот буффер, который вы ей дали.
> неа, strerror возвращает указатель на свой внутренний статический буффер(отсюда проблемы с thread-safety), strerror_r - использует тот буффер, который вы ей дали.
проблем с thread-safety для *strerror* нет. как класса.
> проблем с thread-safety для *strerror* нет. как класса.
IMHO слишком категорично. Да, AFAIK у известных мне Unix-ов
проблем с strerror() я чота не припомню. Но такая реализация
с thread-safe проблемами вполне возможна, и тем не менее она
будет вполне соответствовать стандарту. Из SUSv3:
--- cut---
...
The string pointed to shall not be modified by the application, but may be overwritten by a subsequent call to strerror()or perror().
...
The strerror() function need not be reentrant. A function that is not
required to be reentrant is not required to be thread-safe.
...
--- cut---
> string pointed to shall not be modified by the application, but may be overwritten by a subsequent call to strerror()or perror()
Ужасы какие. Значит кто-то додумался-таки до кривой реализации - ведь не так же просто появилась эти оговорки, и ведь не так же просто сделали функцию с буфером, приходящим снаружи.
---cut--- Ужасы какие. Значит кто-то додумался-таки до кривой реализации - ведь не так же просто появилась эти оговорки, и ведь не так же просто сделали функцию с буфером, приходящим снаружи. ---cut---
---cut--- The contents of the error message strings returned by strerror() should be determined by the setting of the LC_MESSAGES category in the current locale. ---cut---
i.e. если делать локализованную версию strerror, то это уже не простой lookup в заранее сформированной и фиксированной таблице по индексу номера ошибки.