簡體   English   中英

lseek()的返回值

[英]return value of lseek()

我對lseek()的返回值感到困惑(這是新文件的偏移量)

我有文本文件(其名稱為prwtest)。 它的內容被寫到a到z。

而且,我編寫的代碼如下,

  1 #include <unistd.h>
  2 #include <fcntl.h>
  3 #include <stdlib.h>
  4 #include <stdio.h>
  5 #include <string.h>
  6 
  7 #define BUF 50
  8 
  9 int main(void)
 10 {
 11         char buf1[]="abcdefghijklmnopqrstuvwxyz";
 12         char buf2[BUF];
 13         int fd;
 14         int read_cnt;
 15         off_t cur_offset;
 16 
 17         fd=openat(AT_FDCWD, "prwtest", O_CREAT | O_RDWR | O_APPEND);
 18         cur_offset=lseek(fd, 0, SEEK_CUR);
 19         //pwrite(fd, buf1, strlen(buf1), 0);
 20         //write(fd, buf1, strlen(buf1));
 21         //cur_offset=lseek(fd, 0, SEEK_END);
 22 
 23         printf("current offset of file prwtest: %d \n", cur_offset);
 24 
 25         exit(0);
 26 }

在第17行上,我使用標志O_APPEND ,因此prwtest的當前文件偏移量是從i節點的當前文件大小中獲取的。 (26歲)。

在第18行上,我使用SEEK_CUR使用的lseek() ,偏移量為0。

但是結果值cur_offset為0。(我假設它必須為26,因為SEEK_CUR指示當前文件偏移。)但是, SEEK_END給出了我的想法, cur_offset為26。

為什么選擇lseek(fd, 0, SEEK_CUR); 給我返回值0,而不是26?

您的問題是open() / openat() ,而不是lseek()

open()聯機幫助頁中,重點是:

O_APPEND

該文件以追加模式打開。 在每次write(2)之前,文件偏移都位於文件的末尾,就像使用lseek(2)一樣。

由於您不寫入文件,因此偏移量永遠不會重新定位到文件末尾。


在執行此操作時,您應該在結束程序之前關閉文件...


實際上,雖然我們確實在處理它,但是如果您已經 #include <stdio.h> ,為什么不使用標准的文件I / O( fopen() / fseek() / fwrite() )而不是POSIX專用的東西? ;-)

O_APPEND在每次寫入文件之前生效,而不是在打開文件時生效。

因此,在打開后立即將位置保持為0但是如果調用write,則SEEK_CUR上的lseek將返回正確的值。

另外,在Linux上,注釋掉的代碼將無法按預期工作。 這段代碼:

 17         fd=openat(AT_FDCWD, "prwtest", O_CREAT | O_RDWR | O_APPEND);
 18         cur_offset=lseek(fd, 0, SEEK_CUR);
 19         pwrite(fd, buf1, strlen(buf1), 0);

將不會在文件的開頭寫入buf1的內容(除非文件為空)。

在Linux上的pwrite有錯誤:

臭蟲

POSIX要求使用O_APPEND標志打開文件應該對pwrite()寫入數據的位置沒有影響。 但是,在Linux上,如果使用O_APPEND打開文件,則無論offset的值如何, pwrite()將數據追加到文件的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM