什么时候应该使用perror(“…”)和fprintf(stderr,“…”)?
阅读手册页和一些代码并不能真正帮助我理解当我使用perror("...")
还是fprintf(stderr, "...")
之间的区别。
调用perror
会给你解释errno
值,这是一个由POSIX系统调用写入的线程本地错误值(即,每个线程都有自己的errno
值)。 例如,如果你open()
了一个open()
的调用,并且产生了一个错误(也就是返回-1
),那么你可以在之后立即调用perror
来查看实际的错误是什么。 请记住,如果在此期间调用其他系统调用,那么errno
的值将被覆盖,如果以前的系统调用产生错误,调用perror
将不会用于诊断您的问题。
另一方面fprintf(stderr, ...)
可用于打印自己的自定义错误消息。 通过打印stderr
,你可以避免你的错误报告输出与正常的输出混合在一起,这个输出应该是stdout
。
请记住, fprintf(stderr, "%s\n", strerror(errno))
类似于perror(NULL)
因为调用strerror(errno)
将生成strerror(errno)
的打印string值,然后可以将与通过fprintf
任何其他自定义错误消息。
他们做了不同的事情。
你使用perror()
来打印一条消息到与errno
对应的stderr
。 您可以使用fprintf()
将任何内容打印到stderr
或任何其他stream中。 perror()
是一个非常专业的打印function:
perror(str);
相当于
if (str) fprintf(stderr, "%s: %s\n", str, strerror(errno)); else fprintf(stderr, "%s\n", strerror(errno));
perror(const char *s)
:打印你给它的string后跟一个描述errno
当前值的string。
stderr
:这是一个输出stream,用于将自己的错误消息传递给(默认为terminal)。
相关:
char *strerror(int errnum)
:给它一个错误号,它会返回相关的错误string。
perror()总是写入stderr; 与fprintf()一起使用的strerr()可以写入任何输出 – 包括stderr,但不是唯一的。
fprintf(stdout, "Error: %s", strerror(errno)); fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
此外,perror强加自己的文本合成“文本:错误描述”
Perror函数需要更多的时间来执行执行调用从用户空间到内核空间wheras fprintf调用go to api to kernal