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

问题描述 投票:0回答:5

阅读手册页和一些代码并没有真正帮助我 理解之间的区别 - 或者更好的是,当我应该使用 -

perror("...")
fprintf(stderr, "...")
.

c stderr
5个回答
138
投票

调用

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
将其与任何其他自定义错误消息组合。


51
投票

他们做的事情完全不同。

您使用

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

perror(str);

相当于

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

15
投票

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

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

相关:

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


1
投票

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

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

此外,perror 强加了它自己的文本格式“text: error description”


-4
投票

perror
功能需要更多的时间来执行。它的执行调用从用户空间到内核空间,而
fprintf
调用从 API 到内核。

© www.soinside.com 2019 - 2024. All rights reserved.