2013-10-12 42 views
2

如果生成的文件偏移量对于常规文件为负,则该男子项目说lseek应返回-1为什么lseek允许我设置负面文件位置?

为什么这样的代码工作?

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

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

+0

可以将您的文件大小是报告中UINT32_MAX-1? –

+1

至少在我的系统中'lseek(-10)'返回-1和“无效参数”。 –

+0

你使用的是OS/compiler/stdlib? – SheetJS

回答

10

我设法复制你的 “错误” 的行为。您必须包含unistd.h以获得正确的原型。包括这个,lseek的行为如上所述。

当你错过这个include的时候,编译器会通过一个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> 
    
+1

'gcc -Wall'抱怨“函数的隐式声明'lseek'' –

+0

'-Wformat'对'printf'中使用的返回值'offset'发出警告,而不是缺少的声明。 –

+5

默认的另一个原因应该是'-Werror = implicit-function-declaration'。隐式函数不是有效的C,是非常危险的,不应该被编译器接受。 –

3

在某些实现中,负文件偏移对某些设备可能有效。

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

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

lseek

相关问题