perror产生意外的errno值

时间:2011-02-11 22:22:54

标签: c glibc errno

errnoperror一起使用时,我遇到glibc的意外值。如果将不存在的文件指定为arg[1],则会按预期打印Error: 2ENOENT)。但是,当取消注释下面的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);
}

3 个答案:

答案 0 :(得分:5)

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

if (!input_file) {
    int err = errno;
    perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", err);
    return (EXIT_FAILURE);
}

答案 1 :(得分:1)

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

$ ./app fkjhsf
Error: 2

并且perror()调用取消注释:

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

由于某种原因,perror()来电可能会改变您的errno?您使用的是哪些操作系统/编译器/库版本?

答案 2 :(得分:0)

他可能没有任何争论地运行程序。

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

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