阅读手册页和一些代码并没有真正帮助我 了解之间的区别-或更好,当我应该使用-perror("...")或 fprintf(stderr, "...")。
perror("...")
fprintf(stderr, "...")
调用 perror将得到解释后的 errno值,这是 POSIX syscalls 写入的一个线程本地错误值(即,每个线程对于 errno都有自己的值)。例如,如果您调用了 open(),并且生成了一个错误(即,它返回了 -1) ,那么您可以随后立即调用 perror来查看实际错误是什么。请记住,如果同时调用其他系统调用,那么 errno中的值将被写入,如果前面的系统调用生成了错误,那么调用 perror对于诊断问题没有任何用处。
perror
errno
open()
-1
另一方面,fprintf(stderr, ...)可以用来打印自己定制的错误消息。通过打印到 stderr,您可以避免错误报告输出与应该打印到 stdout的“正常”输出混在一起。
fprintf(stderr, ...)
stderr
stdout
请记住,fprintf(stderr, "%s\n", strerror(errno))类似于 perror(NULL),因为对 strerror(errno)的调用将为 errno生成打印的字符串值,然后您可以通过 fprintf将该值与任何其他自定义错误消息结合起来。
fprintf(stderr, "%s\n", strerror(errno))
perror(NULL)
strerror(errno)
fprintf
perror(const char *s): 打印给它的字符串,后面跟一个描述 errno当前值的字符串。
perror(const char *s)
stderr: it's an output stream used to pipe your own error messages to (defaults to the terminal).
Relevant:
给它一个错误号,它就会返回相关的错误字符串。
They do rather different things.
You use perror() to print a message to stderr that corresponds to errno. You use fprintf() to print 什么都行 to stderr, or any other stream. perror() is a very specialized printing function:
perror()
fprintf()
perror(str);
相当于
if (str) fprintf(stderr, "%s: %s\n", str, strerror(errno)); else fprintf(stderr, "%s\n", strerror(errno));
Perror 函数需要更多的时间来执行从用户空间到内核空间的执行调用,而 fprintf 调用从 api 到 kernel
Perror ()总是写入 stderr; strerr(), used together with fprintf(), can write to any output - including stderr but not exclusively.
fprintf(stdout, "Error: %s", strerror(errno)); fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
此外,perror 强加了自己的文本格式“ text: error description”