首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是使用strerror_r的正确方式吗?

这是使用strerror_r的正确方式吗?
EN

Stack Overflow用户
提问于 2013-02-22 01:06:14
回答 1查看 1.5K关注 0票数 1

我为线程安全的strerror_r提供了一个c++包装器,代码如下:

代码语言:javascript
复制
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++代码中,我可以这样说

代码语言:javascript
复制
<< MyErrno() << ..

并使用errno的threadsafe打印。使用128似乎也是可以的,因为手册页说strerror_r将返回一个指向不可变的静态字符串的指针(假设以null结尾),或者返回一个指向buf的指针,不管size...just是否不确定这个简单的包装器是否有问题(可能有buggy)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 02:23:32

我不理解您想要在其中使用它的完整上下文(特别是,结构MyErrno的作用是什么,什么是StreamErrno,因为您的operator<<定义适用于未使用的sockaddr_in类型的值)。

然而,总的来说,这不是一种安全的使用errno的方式,尽管这是一种非常安全的使用strerror_r的方式。

问题是,您最有可能在这样的上下文中使用它:

代码语言:javascript
复制
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这样的自定义类型的一个好理由

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15008162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档