Я предоставляю оболочку c ++ для потокобезопасного strerror_r в таком коде:
struct MyErrno {};
std::ostream& operator<<(std::stream& os, const MyErrno& err)
{
const int len = 128
char buf [len];
os << strerror_r(errno, buf, len);
return os;
}
Это просто оболочка, поэтому в коде C ++ я могу сказать что-то вроде
<< MyErrno() << ..
и используйте потокобезопасную печать ошибки. Также, кажется, можно использовать 128, потому что на странице руководства написано strerror_r
будет либо возвращать указатель на неизменяемую статическую строку (предположительно нулевое завершение) или указатель на buf
после заполнения нулевым терминатором независимо от размера … просто не уверен, что с этой простой оболочкой что-то не так (возможно, глючит)
Я не понимаю полный контекст, в котором вы хотите использовать это (в частности, какова роль структуры MyErrno
и что StreamErrno
, так как ваш operator<<
определение относится к значению типа sockaddr_in
который не используется).
Однако, в общих чертах, это не безопасный способ использования errno
, хотя это совершенно безопасный способ использования strerror_r
,
Проблема в том, что вы, скорее всего, используете это в таком контексте:
if ((something) != OK) {
std::cerr << "Something bad happened: "<< (some value which causes your function to be called)
<< ...
}
То есть, между системным вызовом, который потерпел неудачу, вероятно, будет какой-то системный вызов (вывод строки «Произошло что-то плохое»), оставив значение в errno
и использование errno
в вашей функции. Довольно хорошо любой системный вызов может вызвать errno
быть установленным, даже если ошибка безвредна; следовательно, лучшая практика заключается в том, чтобы errno
немедленно. Это было бы хорошей причиной для использования пользовательского типа, такого как MyError
:
struct MyError {
int error;
MyError(int err) : error(err) {}
};
std::ostream& operator<<(std::ostream& os, const MyError& e) {
// as with your function, but using `e.error` instead of `errno`
}
if ((something) != OK) {
MyError e(errno);
std::cerr << "Something bad happened: " << e
<< ...
}
Других решений пока нет …