什么时候应该使用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