gpt4 book ai didi

c++ - 这是使用 strerror_r 的正确方法吗?

转载 作者:行者123 更新时间:2023-11-30 02:57:00 25 4
gpt4 key购买 nike

我在这样的代码中为线程安全的 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 的线程安全打印。使用 128 似乎也可以,因为手册页说 strerror_r 将返回一个指向不可变静态字符串的指针(可能以 null 终止)或一个指向 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)
<< ...
}

也就是说,在失败的系统调用之间可能会有一些系统调用(输出字符串“Something bad happened”),在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
<< ...
}

关于c++ - 这是使用 strerror_r 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com