gpt4 book ai didi

c++ - 当 std::fprintf(stderr,...) 失败时,操作是没有效果还是可以在失败前写一点?

转载 作者:IT老高 更新时间:2023-10-28 23:17:56 24 4
gpt4 key购买 nike

我有一个 C++11 程序,它使用 std::fprintf 写入 stderr 作为日志和调试信息。我知道 fprintf 可能会失败并返回负值,但我找不到操作是原子的(如果失败,则无效)或者它可以写入文本的某些部分然后失败(或任何其他副作用)。

使用 fprintf 的函数如下所示:

void writeToConsole (std::string const &message)
{
std::fprintf(stderr, "%s\n", message.c_str());
}

我正在 Linux 上使用 Clang 和 GCC 进行开发(目前),但我的问题更多的是关于标准,所以...

问题:

如果 std::fprintf 失败,是否仍有可能某些字符已写入 stderr?这种行为是 C/C++ 标准还是实现定义的?

更重要的是,如果 std::fprintf 失败,我应该中止程序还是可以在没有副作用的情况下静默继续执行(除了不可能写入 stderr 之外)?

最佳答案

请记住,printf 系列函数(几乎总是)最终会变成 write(2) 函数调用(或其他类似的低级 OS/实现提供的等效项)。此功能可以部分成功。如果至少写入一个字节,则函数成功(如果没有检测到来自底层目标的错误 - 例如,信号处理程序的中断)并将返回实际写入的字节数:

The number of bytes written may be less than count if, for example, there is insufficient space on the underlying physical medium, or the RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the call was interrupted by a signal handler after having written less than count bytes. [...]

有关部分写入的信息,请参阅 write(2),例如 http://man7.org/linux/man-pages/man2/write.2.html . errno 的值或部分写入的其他影响可能取决于输出介质(或文件描述符表示的内容 - 内存映射文件、常规文件等),以及特定的 失败的原因。比如ENOMEM, EIO, EDQUOT都是可能的。

有关多线程原子性的更多信息,另请参见链接的手册页。

您的其他问题:

Even more, if std::printf fails, should I abort the program or can continue execution silently without side effects (other than impossibility of write to stderr)?

这真的取决于你的程序。

关于c++ - 当 std::fprintf(stderr,...) 失败时,操作是没有效果还是可以在失败前写一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27736641/

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