c - 为什么 fseeko() 会失败并显示 EINVAL?

标签 c 32bit-64bit glibc fseek large-file-support

我需要将 LFS 添加到使用 fseek() 的 C 进程中。 gcc和glibc的版本分别是3.2.3和2.5。

我做了以下修改:

  1. 已添加CFLAGS += -D_FILE_OFFSET_BITS=64到 makefile。
  2. 我将调用改为 fseek()调用fseeko() (我还需要 MSVC6 支持,但一次一步)。
  3. 我已将第二个参数的类型更改为 off_tsizeof()变量返回 8。

这是一个很好的示例 main()因为我可以通过我们的 DLP 及其输出:

fd = fopen("large_file", "rb");
off_t offset = 1ULL << 32;
rc = fseeko(fd, offset, SEEK_SET);

rc = -1 sizeof(offset)=8 errno=22 offset=2147483648

最佳答案

1 << 32在你的例子中是未定义的行为。它很可能返回 0 或 1。请确保在移位之前将 1 转换为合适的类型。如果unsigned long也是 32 位,那么 1UL << 32同样是错误的。

避免-D_LARGEFILE64_SOURCEoff64_t ,因为它们只会让事情变得更加复杂。相反,仅使用 -D_FILE_OFFSET_BITS=64并使用off_t那么应该是 64 位。

关于c - 为什么 fseeko() 会失败并显示 EINVAL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009799/

相关文章:

c - 在 32 位机器上使用 48 位

c# - 在 32 位应用程序中使用 64 位 DLL

java - 在 Java 应用程序中混合运行 32 位和 64 位 native 库

assembly - fs :0x30 provide in Linux? 是什么

linux - 使 calloc 机会化

c - 明智地读取文件元素

c++ - c中的类型是什么类型?

linux - 使用 LDFLAGS ="-static"构建 screen

C程序在输入大写字母时跳行?

c - 如何获取 flex/lex 目前正在词法分析的当前行以在 yyerror 中使用它?