什么时候应该使用 perror (“ ...”)和 fprintf (stderr,“ ...”) ?

阅读手册页和一些代码并没有真正帮助我 了解之间的区别-或更好,当我应该使用-perror("...")fprintf(stderr, "...")

85390 次浏览

调用 perror将得到解释后的 errno值,这是 POSIX syscalls 写入的一个线程本地错误值(即,每个线程对于 errno都有自己的值)。例如,如果您调用了 open(),并且生成了一个错误(即,它返回了 -1) ,那么您可以随后立即调用 perror来查看实际错误是什么。请记住,如果同时调用其他系统调用,那么 errno中的值将被写入,如果前面的系统调用生成了错误,那么调用 perror对于诊断问题没有任何用处。

另一方面,fprintf(stderr, ...)可以用来打印自己定制的错误消息。通过打印到 stderr,您可以避免错误报告输出与应该打印到 stdout的“正常”输出混在一起。

请记住,fprintf(stderr, "%s\n", strerror(errno))类似于 perror(NULL),因为对 strerror(errno)的调用将为 errno生成打印的字符串值,然后您可以通过 fprintf将该值与任何其他自定义错误消息结合起来。

perror(const char *s): 打印给它的字符串,后面跟一个描述 errno当前值的字符串。

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(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”