1

errno在使用perrorwith时遇到了意想不到的价值glibc。当一个不存在的文件被指定为它按预期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);
}
4

3 回答 3

5

在调用其他库函数后,您不能依赖 的值,errno换句话说,您对 perror() 本身的调用可能会修改 的值errno 如果您希望能够使用它,您需要将其保存在临时变量中在调用其他库过程之后。

if (!input_file) {
    int err = errno;
    perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", err);
    return (EXIT_FAILURE);
}
于 2011-02-11T23:08:51.637 回答
1

您的程序在这里按预期工作:

$ ./app fkjhsf
Error: 2

并且perror()电话未注释:

$ ./app asdkfljh
asdkfljh: No such file or directory
Error: 2

也许这个电话因为某种原因perror()改变了你?errno您使用的是什么操作系统/编译器/库版本?

于 2011-02-11T22:38:08.920 回答
0

他很可能在没有任何参数的情况下运行该程序。

如果是这样,“argv[argc - 1]”将评估为垃圾。

应该有代码来确保“argc-1”在有效范围内。

于 2011-02-11T23:02:47.597 回答