Это правильный способ использования strerror_r?

Я предоставляю оболочку 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 после заполнения нулевым терминатором независимо от размера … просто не уверен, что с этой простой оболочкой что-то не так (возможно, глючит)

1

Решение

Я не понимаю полный контекст, в котором вы хотите использовать это (в частности, какова роль структуры 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
<< ...
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]