为什么lseek允许我设置一个负面的文件位置?

该男子条目说lseek应该返回-1如果产生的文件偏移将是负面的一个普通的文件。

为什么这样的代码工作?

 int fd; off_t offset; fd = open("test.txt", O_RDWR); offset = lseek(fd, -10, SEEK_SET); printf("%d\n", offset); // prints -10 if (offset == (off_t) -1) perror("seek"); // error not triggered 

我觉得我应该得到offset=-1errno设置为EINVAL

这也会导致文件大小显得非常大(接近无符号整数的大小) – 看起来像溢出问题。 这是为什么?

我设法重现你的“错误”的行为。 您必须包含unistd.h才能获得正确的原型。 包括这一点, lseek行为如上所述。

当你错过这个包括,编译器传递一个int -10而不是一个off_t -10 。 这会导致你观察到的行为。

更新:

所需的完整列表包括

  • open(2)

     #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 
  • lseek(2)

     #include <sys/types.h> #include <unistd.h> 
  • printf(3)perror(3)

     #include <stdio.h> 

在一些实现中,负文件偏移对于一些设备可能是有效的。

POSIX.1-1990标准没有specifically prohibit lseek() from returning a negative offset 。 因此,应用程序需要在调用之前清除errno,并在返回时检查errno以确定( off_t)-1的返回值是否为偏移量或错误条件的指示。

标准开发人员不希望在合规应用程序中要求执行此操作,并且当生成的文件偏移量对于常规文件,块特殊文件或目录为负数时,选择要求将errno设置为[EINVAL]

见lseek