将errno
与perror
一起使用时,我遇到glibc
的意外值。如果将不存在的文件指定为arg[1]
,则会按预期打印Error: 2
(ENOENT
)。但是,当取消注释下面的perror
行时,无论我传递的是什么,它都会抛出错误22(EINVAL
)。任何人都可以解释为什么会这样设置?
#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);
}
答案 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”在有效范围内。