阅读手册页和一些代码并没有真正帮助我理解-或者更好地说,当我应该使用-perror("...")或fprintf(stderr, "...")时。
perror("...")
fprintf(stderr, "...")
sgtfey8w1#
调用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
open()
-1
fprintf(stderr, ...)
stderr
stdout
fprintf(stderr, "%s\n", strerror(errno))
perror(NULL)
strerror(errno)
fprintf
sg3maiej2#
他们做相当不同的事情。使用perror()将消息打印到stderr,该消息对应于errno。您可以使用fprintf()将 * 任何内容 * 打印到stderr或任何其他流。perror()是一个非常专业的打印功能:
perror()
fprintf()
perror(str);
相当于
if (str) fprintf(stderr, "%s: %s\n", str, strerror(errno)); else fprintf(stderr, "%s\n", strerror(errno));
xbp102n03#
perror(const char *s):打印您给予的字符串,后跟一个描述errno当前值的字符串。stderr:这是一个输出流,用于将您自己的错误消息传递到(默认为终端)。相关:char *strerror(int errnum):给予它一个错误号,它将返回相关的错误字符串。
perror(const char *s)
char *strerror(int errnum)
yruzcnhs4#
perror()总是写入stderr; strrr()与fprintf()一起使用,可以写入任何输出,包括stderr,但不限于此。
fprintf(stdout, "Error: %s", strerror(errno)); fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
此外,perror强加了自己的文本格式“文本:错误说明”
guz6ccqo5#
perror函数需要更多的时间来执行。它的执行调用从用户空间转到内核空间,而fprintf调用从API转到内核。
5条答案
按热度按时间sgtfey8w1#
调用
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
将其与任何其他自定义错误消息组合在一起。sg3maiej2#
他们做相当不同的事情。
使用
perror()
将消息打印到stderr
,该消息对应于errno
。您可以使用fprintf()
将 * 任何内容 * 打印到stderr
或任何其他流。perror()
是一个非常专业的打印功能:相当于
xbp102n03#
perror(const char *s)
:打印您给予的字符串,后跟一个描述errno
当前值的字符串。stderr
:这是一个输出流,用于将您自己的错误消息传递到(默认为终端)。相关:
char *strerror(int errnum)
:给予它一个错误号,它将返回相关的错误字符串。yruzcnhs4#
perror()总是写入stderr; strrr()与fprintf()一起使用,可以写入任何输出,包括stderr,但不限于此。
此外,perror强加了自己的文本格式“文本:错误说明”
guz6ccqo5#
perror
函数需要更多的时间来执行。它的执行调用从用户空间转到内核空间,而fprintf
调用从API转到内核。