1

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 }

number 行17で flag を使用O_APPENDしているため、prwtest の現在のファイル オフセットは i ノードの現在のファイル サイズから取得されます。(26歳です)。

行番号18lseek()は、SEEK_CUR で使用されるものを使用し、オフセットは 0 です。

しかし、結果の値cur_offsetは 0 です (SEEK_CUR は現在のファイル オフセットを示しているため、26 である必要があるSEEK_ENDと思います) cur_offset

lseek(fd, 0, SEEK_CUR);戻り値が 26 ではなく 0 になるのはなぜですか?

4

3 に答える 3

3

あなたの問題はopen()/openat()ではなく にありlseek()ます。

マンページからopen()、強調鉱山:

O_APPEND

ファイルは追加モードで開かれます。各 write(2) の前に、lseek(2) の場合と同様に、ファイル オフセットがファイルの末尾に配置されます。

ファイルに書き込まないため、オフセットがファイルの末尾に再配置されることはありません。


作業中は、プログラムを終了する前にファイルを閉じる必要があります...


実際、私たちは本当にそれに取り組んでいます 、既に行っているのであれば、POSIX 固有のものの代わりに#include <stdio.h>標準のファイル I/O ( fopen()/ fseek()/ ) を使用してみませんか? fwrite();-)

于 2016-02-29T09:06:59.427 に答える
3

O_APPENDファイルを開くときではなく、ファイルへの各書き込みの前に有効になります。

したがって、オープン直後はポジションが残り0ますが、書き込みを呼び出すと、lseekオンSEEK_CURは正しい値を返します。

于 2016-02-29T09:07:44.803 に答える