【发布时间】:2020-03-03 13:56:36
【问题描述】:
下面是简单c代码的sn-p:
#include <stdio.h>
int main(void) {
FILE *fd = fopen("nothing", "r");
// perror("fopen");
return 0;
}
它什么也不打印,但如果 perror("fopen") 未注释,它会打印
fopen: No such file or directory
根据perror的手册页
当系统调用失败时,通常返回-1并设置变量 errno 到一个描述出了什么问题的值。
而No such file or directory对应errno = 2
由于stderr是无缓冲的,似乎只有在调用perror时才会将错误消息写入stderr,为什么c程序会隐式忽略错误(errno已修改)而不是立即写入发给stderr?
其他问题...
还有其他方法可以触发stderr的写作吗?我们是否总是必须“手动”触发它,还是 c 程序在某些情况下可以“自动”使其像 java 抛出运行时异常一样?
【问题讨论】:
-
什么?当然,如果没有调用
perror(),它不会打印错误?我不明白。 -
@unwind
errno设置为2无论perror()是否被调用,所以确实会发生错误 -
是的,但是通过查看
fopen和errno的返回值,您可以知道。程序员可以决定是否进行通信以及如何处理此错误,因为您知道它是否严重。 -
我不确定是否最好打开一个新问题而不是使用旧问题作为额外问题,特别是因为已经有一个解决原始问题的答案。跨度>
-
至于您的额外问题:您始终可以编写行为类似于库函数的包装函数,如果出现问题则记录错误。 (是的,标准库中有很多函数,但您可以在需要时随时创建包装器。)
标签: c system-calls errno