2013-10-12 67 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

相關問題