我对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?

最佳答案

另外,在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是小车:
漏洞
posix要求打开带有O_APPEND标志的文件时
pwrite()写入数据的位置没有影响。
但是,在Linux上,如果文件是用O_APPEND打开的,pwrite()
将数据追加到文件末尾,而不管
抵消。

关于c - lseek()的返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35695471/

10-15 05:41