Answers:
调用perror
将为您提供的解释值errno
,这是POSIX系统调用写入的线程局部错误值(即,每个线程都有其自己的值errno
)。例如,如果您对进行了调用open()
,并且生成了错误(即返回-1
),则可以在此后perror
立即调用以查看实际错误是什么。请记住,如果在此期间调用其他syscall,则in的值errno
将被覆盖,并且perror
如果较早的syscall生成了错误,则调用对于诊断问题将没有任何用处。
fprintf(stderr, ...)
另一方面,可用于打印您自己的自定义错误消息。通过打印到stderr
,可以避免将错误报告输出与应发送到的“常规”输出混合stdout
。
请记住,这fprintf(stderr, "%s\n", strerror(errno))
与相似,perror(NULL)
因为对的调用strerror(errno)
将为生成打印的字符串值errno
,然后可以通过将其与任何其他自定义错误消息合并fprintf
。
strerror
不需要是线程安全的。这很愚蠢,但这是标准。strerror_l
可以用作POSIX 2008系统上的替代产品。strerror_r
也可以在较旧的系统上使用,但对于某些版本不一致的系统,确实存在令人讨厌的问题。
perror
加上'\n'
,这样的格式将是"%s\n"
,不是吗?
strerror_s
实际上作为接口不是太差。
_s
基本上,将他们的垃圾纳入标准是MS的游戏(“如果采用我们的界面,我们将考虑实际上使我们的产品支持您的标准。”)当然,现在他们并没有遵循。实际上,我同意这个界面本身并不坏。不好的是,宣传(以编译器警告的形式),大多数标准库都是“不安全的”,_s
应该使用整个函数家族而不是标准函数。
perror(const char *s)
:打印您提供的字符串,后跟描述的当前值的字符串errno
。
stderr
:这是用于将您自己的错误消息传递到的输出流(默认为终端)。
相关:
char *strerror(int errnum)
:给它一个错误号,它将返回相关的错误字符串。
If you use a function that effects errno then it makes sense to use perror
如果使用的函数不会影响errno并仅返回错误代码,则应使用fprintf(stderr,fmt,...)。例如,如果字符串超出范围,strtol将返回LONG_MAX或LONG_MIN并将errno设置为ERANGE。因此,如果由于超出范围而导致strtol失败,我将使用perror。