为什么系统调用失败时c程序不会向stderr打印错误消息?

问题描述 投票:1回答:1

下面是简单的C代码片段:

#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抛出运行时异常一样“自动”使其触发?

c system-calls errno
1个回答
0
投票

系统和/或库调用在出现错误时不会自动打印消息。这取决于您。这些函数将执行的操作是返回特定值以指示错误,并设置errno指示特定错误。然后,您可以使用perror打印与errno当前值相对应的错误字符串。

[在fopen的情况下,如果呼叫失败,则返回NULL。因此,您需要检查是否这样做,如果是,请使用perror打印消息。

FILE *fd = fopen("nothing", "r");
if (fd == NULL) {
    perror("fopen failed");
}

以这种方式执行操作可以使您更好地控制程序。例如,在某些情况下,您可能希望文件not存在,因此,无法打开文件不是错误,因此在这种情况下,您不想打印错误。

© www.soinside.com 2019 - 2024. All rights reserved.