C lseek()的返回值

C lseek()的返回值,c,linux,file,lseek,C,Linux,File,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 in

我对
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 }
1#包括
2#包括
3#包括
4#包括
5#包括
6.
7#定义BUF 50
8.
9内部干管(空)
10 {
11 char buf1[]=“abcdefghijklmnopqrstuvwxyz”;
12个字符buf2[BUF];
13 int fd;
14整数读取;
15关电流偏移量;
16
17 fd=openat(在FDCWD,“prwtest”,O|U创建| O|U RDWR | O|U附加);
18 cur_offset=lseek(fd,0,SEEK_cur);
19//pwrite(fd,buf1,strlen(buf1),0);
20//写入(fd、buf1、strlen(buf1));
21//cur_offset=lseek(fd,0,SEEK_END);
22
23 printf(“文件prwtest的当前偏移量:%d\n”,当前偏移量);
24
25出口(0);
26 }
在行号
17
上,我使用标志
O_APPEND
,因此prwtest的当前文件偏移量取自I节点的当前文件大小。(26)

在行号
18
上,我使用SEEK\u CUR使用的
lseek()
,偏移量为0

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


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

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

open()
手册页中,强调:

O_追加

文件以附加模式打开在每次写入(2)之前,文件偏移量位于文件末尾,就像lseek(2)一样

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


当我们进行此操作时,您应该在结束程序之前关闭文件



事实上,当我们真的这么做的时候,如果您已经包含了标准的文件I/O(
fopen()
/
fseek()
/
fwrite()
),为什么不使用标准的文件I/O来代替POSIX特定的东西呢?-)

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

open()
手册页中,强调:

O_追加

文件以附加模式打开在每次写入(2)之前,文件偏移量位于文件末尾,就像lseek(2)一样

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


当我们进行此操作时,您应该在结束程序之前关闭文件



事实上,当我们真的这么做的时候,如果您已经包含了标准的文件I/O(
fopen()
/
fseek()
/
fwrite()
),为什么不使用标准的文件I/O来代替POSIX特定的东西呢?-)

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


因此,打开后,位置保持为
0
,但如果调用write,则
SEEK\u CUR
上的
lseek
将返回正确的值。

O\u APPEND
在每次写入文件之前生效,而不是在打开文件时生效


因此,打开后,位置保持为
0
,但如果调用write,则
SEEK\u 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
的内容(除非文件为空)

四轮马车:

虫子

POSIX要求打开带有
O_APPEND
标志的文件时 对
pwrite()
写入数据的位置没有影响。 但是,在Linux上,如果使用
O_APPEND
打开文件,
pwrite()
将数据追加到文件末尾,而不考虑 抵消


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

四轮马车:

虫子

POSIX要求打开带有
O_APPEND
标志的文件时 对
pwrite()
写入数据的位置没有影响。 但是,在Linux上,如果使用
O_APPEND
打开文件,
pwrite()
将数据追加到文件末尾,而不考虑 抵消


请注意,由于您在标志中使用了O_CREAT,因此还必须提供一个4。参数openat(),要使用的文件权限模式。请注意,由于您在标志中使用了O_CREAT,因此还必须提供4。参数openat(),要使用的文件权限模式。