我为线程安全的strerror_r提供了一个c++包装器,代码如下:
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() << ..并使用errno的threadsafe打印。使用128似乎也是可以的,因为手册页说strerror_r将返回一个指向不可变的静态字符串的指针(假设以null结尾),或者返回一个指向buf的指针,不管size...just是否不确定这个简单的包装器是否有问题(可能有buggy)
发布于 2013-02-22 02:23:32
我不理解您想要在其中使用它的完整上下文(特别是,结构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之间,可能会有一些系统调用(输出字符串"Something bad happened")。任何系统调用都可能导致设置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
<< ...
}https://stackoverflow.com/questions/15008162
复制相似问题