c - 我什么时候应该使用perror(“...”)和fprintf(stderr,“......”)?

阅读手册页和一些代码并没有真正帮助我了解之间的差异 - 或更好,何时应该使用 - perror("...")fprintf(stderr, "...")

freeboy1015 asked 2019-08-13T18:57:18Z
5个解决方案
100 votes

调用fprintf(stderr, "%s\n", strerror(errno))会给出解释值perror(NULL),这是由POSIX系统调用写入的线程局部错误值(即,每个线程都有自己的值strerror(errno))。 例如,如果您拨打了errno,并且生成了错误(即,它返回了fprintf),那么您可以立即调用perror以查看实际错误是什么。 请记住,如果在此期间调用其他系统调用,则errno中的值将被覆盖,如果早期系统调用生成错误,则调用perror将无法用于诊断问题。

另一方面,fprintf(stderr, "%s\n", strerror(errno))可用于打印您自己的自定义错误消息。 通过打印到perror(NULL),可以避免错误报告输出与" normal" 输出应该转到strerror(errno)

请记住,fprintf(stderr, "%s\n", strerror(errno))类似于perror(NULL),因为致电strerror(errno)将生成errno的打印字符串值,然后您可以通过fprintf将其与任何其他自定义错误消息进行组合。

Jason answered 2019-08-13T18:57:50Z
36 votes

他们做了不同的事情。

您可以使用perror()打印与stderr相关的邮件,它对应errno。您可以使用fprintf()打印任何内容到stderr或任何其他数据流。 perror()是一个非常专业的打印功能:

perror(str);

相当于

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));
freeboy1015 answered 2019-08-13T18:58:27Z
10 votes

char *strerror(int errnum):打印您为其提供的字符串,后跟描述当前值errno的字符串。

char *strerror(int errnum):它是用于将您自己的错误消息传递给(默认为终端)的输出流。

相关:

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

Adib answered 2019-08-13T18:59:11Z
0 votes

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

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

此外,perror强加了自己的文本格式"文本:错误描述"

Sebastien answered 2019-08-13T18:59:47Z
-2 votes

Perror函数需要更多时间来执行从用户空间到内核空间的执行调用,而fprintf调用则转到api到kernal

vivek singh answered 2019-08-13T19:00:15Z
translate from https://stackoverflow.com:/questions/12102332/when-should-i-use-perror-and-fprintfstderr