120

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

4

5 回答 5

130

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

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

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

于 2012-08-24T02:07:20.567 回答
49

他们做的事情完全不同。

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

perror(str);

相当于

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));
于 2012-08-24T02:35:08.370 回答
15

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

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

相关的:

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

于 2012-08-24T02:07:59.590 回答
2

perror() 总是写入标准错误;strerr() 与 fprintf() 一起使用,可以写入任何输出 - 包括 stderr,但不限于此。

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

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

于 2017-03-19T14:28:07.723 回答
-3

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

于 2015-02-04T07:53:57.857 回答