【发布时间】:2011-02-11 22:22:53
【问题描述】:
在将perror 与glibc 一起使用时,我遇到了意外的errno 值。当一个不存在的文件被指定为arg[1] 时,它会按预期打印Error: 2(即ENOENT)。但是,当下面的 perror 行未注释时,无论我通过什么,它都会引发错误 22 (EINVAL)。谁能解释一下为什么会这样设置?
编辑:看起来这是某种 Eclipse 错误。 IDE 似乎导致 perror 引发某种错误,该程序在命令行上完美运行,并且当在 Eclipse 的参数列表中指定正确的文件时完美运行。在 Eclipse 中运行时会错误地失败。
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
FILE *input_file;
input_file = fopen(argv[argc - 1], "r");
if (!input_file) {
// perror(argv[argc-1]);
fprintf(stderr, "Error: %d\n", errno);
return (EXIT_FAILURE);
}
else {
fclose(input_file);
}
return (EXIT_SUCCESS);
}
【问题讨论】:
-
你是说 perror() 调用打印了错误的东西,还是说 fprintf 如果你调用 perror() 打印了错误的东西?
-
两者都不是。我是说 perror 以一种意想不到的方式设置 errno。
-
@谁保证过 perror 会对 errno 造成什么影响?为什么同时调用 perror 并打印 errno?请参阅下面的 rlibby 的答案(做个好人并接受它)。