繁体   English   中英

什么时候应该使用 perror("...") 和 fprintf(stderr, "...")?

[英]When should I use perror("...") and fprintf(stderr, "...")?

阅读手册页和一些代码并不能真正帮助我理解 - 或者更好,什么时候应该使用 - perror("...")fprintf(stderr, "...")

调用perror将为您提供errno的解释值,这是由POSIX系统调用写入的线程局部错误值(即,每个线程都有自己的errno值)。 例如,如果你调用open() ,并且生成了一个错误(即返回-1 ),那么之后你可以立即调用perror以查看实际错误是什么。 请记住,如果在此期间调用其他系统调用,则errno的值将被覆盖,如果早期系统调用生成错误,则调用perror对诊断问题没有任何用处。

另一方面fprintf(stderr, ...)可用于打印您自己的自定义错误消息。 通过打印到stderr ,可以避免错误报告输出与应该转到stdout “正常”输出混合。

请记住, fprintf(stderr, "%s\\n", strerror(errno))类似于perror(NULL)因为调用strerror(errno)会产生印刷字符串值errno ,然后就可以结合这与fprintf任何其他自定义错误消息。

他们做了不同的事情。

您使用perror()将消息打印到与errno对应的stderr 您使用fprintf()任何内容打印到stderr或任何其他流。 perror()是一个非常专业的打印功能:

perror(str);

相当于

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));

perror(const char *s) :打印你给它的字符串,后跟一个描述errno当前值的字符串。

stderr :它是一个输出流,用于将自己的错误消息传递给(默认为终端)。

相关:

char *strerror(int errnum) :给它一个错误号,它将返回相关的错误字符串。

perror()总是写给stderr; strerr()与fprintf()一起使用,可以写入任何输出 - 包括stderr但不是唯一的。

fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")

此外,perror强制自己的文本格式化“文本:错误描述”

Perror函数需要更多时间来执行执行调用从用户空间到内核空间frasf调用goest到api到kernal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM