return lseek() 的值

return value of lseek()

我对 lseek() 的 return 值(这是新文件偏移量)感到困惑

我有文本文件(它的名字是 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-node的当前文件大小。 (是 26)。

行号18,我用的是SEEK_CUR用的lseek(),偏移量是0。

但结果值cur_offset为0。(我假设它必须是26,因为SEEK_CUR表示当前文件偏移量。) 然而,SEEK_END 给了我我的想法,cur_offset 是 26。

为什么 lseek(fd, 0, SEEK_CUR); 给我 return 值 0,而不是 26?

您的问题是 open() / openat(),而不是 lseek()

来自 open() 联机帮助页,强调我的:

O_APPEND

The file is opened in append mode. Before each write(2), the file offset is positioned at the end of the file, as if with lseek(2).

由于您不写入文件,因此永远不会将偏移量重新定位到文件末尾。


当我们这样做时,您应该在结束程序之前关闭文件...


实际上,虽然我们真的在做,如果您已经 #include <stdio.h>,为什么不使用标准的文件 I/O (fopen() / fseek() / fwrite()) 而不是 POSIX-特定的东西? ;-)

O_APPEND在每次写入文件之前生效,而不是在打开文件时生效。

因此,在开仓之后,头寸仍然是 0,但如果您调用写入,SEEK_CUR 上的 lseek 将 return 正确值。

此外,在 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的内容(除非文件为空)。

pwrite on Linux 有问题:

BUGS

POSIX requires that opening a file with the O_APPEND flag should have no effect on the location at which pwrite() writes data. However, on Linux, if a file is opened with O_APPEND, pwrite() appends data to the end of the file, regardless of the value of offset.