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

时间:2012-08-24 02:03:07

标签: c stderr

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

5 个答案:

答案 0 :(得分:100)

调用perror将为您提供errno的解释值,这是由POSIX系统调用写入的线程局部错误值(即,每个线程都有errno自己的值)。例如,如果您调用open(),并且生成了错误(即,它返回-1),那么您可以立即调用perror以查看实际错误是。请记住,如果您在此期间调用其他系统调用,则errno中的值将被覆盖,如果生成错误,则调用perror对诊断问题没有任何用处通过早期的系统调用。

另一方面,

fprintf(stderr, ...)可用于打印您自己的自定义错误消息。通过打印到stderr,可以避免错误报告输出与应该转到stdout的“正常”输出混合。

请注意,fprintf(stderr, "%s\n", strerror(errno))perror(NULL)类似,因为调用strerror(errno)会为errno生成打印的字符串值,然后您可以将其与任何内容合并其他自定义错误消息来自fprintf

答案 1 :(得分:37)

他们做了不同的事情。

您使用perror()打印与stderr对应的errno邮件。您可以使用fprintf()任何打印到stderr或任何其他信息流。 perror()是一个非常专业的打印功能:

perror(str);

相当于

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));

答案 2 :(得分:10)

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

stderr:它是一个输出流,用于将您自己的错误消息传递给(默认为终端)。

相关:

char *strerror(int errnum):给它一个错误号,它将返回相关的错误字符串。

答案 3 :(得分:0)

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”

答案 4 :(得分:-2)

Perror函数需要更多时间来执行从用户空间到内核空间的执行调用frasf调用goest到api到kernal