繁体   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