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。