perror产生意外的errno值

Rya*_*yan 1 c glibc errno

我遇到的一个意想不到的价值errno在使用perrorglibc.当指定不存在的文件时,arg[1]它按预期打印Error: 2(即ENOENT).但是当perror下面的行被取消注释时,EINVAL无论我传递什么,它都会抛出错误22().任何人都可以解释为什么这个设置?

编辑:看起来这是某种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);
}
Run Code Online (Sandbox Code Playgroud)

rli*_*bby 5

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

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