阅读手册页和一些代码并没有真正帮助我当我应该使用-perror("...")
或fprintf(stderr, "...")
时,理解两者之间的区别或更好。
调用perror
将为您提供errno
的解释值,这是POSIX系统调用写入的线程本地错误值(即,每个线程都有自己的errno
值)。例如,如果您对open()
进行了调用,并且生成了一个错误(即返回-1
),那么您可以立即调用perror
来查看实际错误是什么。请记住,如果同时调用其他系统调用,那么errno
中的值将被重写,并且如果先前的系统调用生成错误,则调用perror
在诊断问题时将没有任何用处。
另一方面,fprintf(stderr, ...)
可以用于打印您自己的自定义错误消息。通过打印到stderr
,您可以避免错误报告输出与应该发送到stdout
的"正常"输出混合。
请记住,fprintf(stderr, "%sn", strerror(errno))
与perror(NULL)
类似,因为对strerror(errno)
的调用将生成errno
的打印字符串值,然后您可以通过fprintf
将其与任何其他自定义错误消息组合。
他们做的事情截然不同。
您可以使用perror()
将消息打印到对应于errno
的stderr
。您可以使用fprintf()
将任何打印到stderr
或任何其他流。perror()
是一种非常专业的打印功能:
perror(str);
相当于
if (str)
fprintf(stderr, "%s: %sn", str, strerror(errno));
else
fprintf(stderr, "%sn", strerror(errno));
perror(const char *s)
:打印您给它的字符串,后跟一个描述errno
当前值的字符串。
stderr
:它是一个输出流,用于将您自己的错误消息管道传输到(默认为终端)。
相关:
char *strerror(int errnum)
:给它一个错误号,它会返回相关的错误字符串。
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"
perror
函数需要更多时间才能执行。它的执行调用从用户空间进入内核空间,而fprintf
调用从API进入内核。