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.
我对 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 whichpwrite()
writes data. However, on Linux, if a file is opened withO_APPEND
,pwrite()
appends data to the end of the file, regardless of the value of offset.