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