perror 生成意外的 errno 值

发布于 2024-10-16 19:25:02 字数 761 浏览 7 评论 0原文

在将 perrorglibc 结合使用时,我遇到了意外的 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);
}

I am experiencing an unexpected value of errno when using perror with glibc. When an non-existent file is specified as arg[1] it prints Error: 2 ( which isENOENT) as expected. However when the perror line below is uncommented it throws error 22 (EINVAL) no matter what I pass it. Can anyone please explain why this is getting set?

EDIT: Looks like this is some sort of Eclipse bug. The IDE seems to be causing perror to throw some sort of error, the program works perfectly on the command line, and works perfectly when a correct file is specified in the argument list in Eclipse. It fails incorrectly when run inside of 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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

回忆躺在深渊里 2024-10-23 19:25:02

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

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

You can't rely on the value of errno after calling into other library functions, in other words your call to perror() itself may be modifying the value of errno You need to save it in a temporary variable if you want to be able to use it after calls into other library procedures.

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

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

$ ./app fkjhsf
Error: 2

并且 perror() 调用未注释:

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

也许 perror() 调用正在更改您的 errno有什么原因吗?您使用什么操作系统/编译器/库版本?

Your program works as expected for me here:

$ ./app fkjhsf
Error: 2

and with the perror() call uncommented:

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

Maybe the perror() call is changing your errno for some reason? What operating system/compiler/library versions are you using?

染墨丶若流云 2024-10-23 19:25:02

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

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

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

He's likely running the program without any arguments.

If so, "argv[argc - 1]" will evaluate to garbage.

There should be code to make sure that "argc-1" is within a valid range.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文