1
int main(int argc, char *argv[]) 

{

int i, j, count;
int f1;
char buf[16];
f1 = open(argv[1], O_RDWR | O_APPEND);
if(f1 == -1)
    perror("open failed");

if(lseek(f1, 0, SEEK_SET) == -1)
    printf("lseek failed\n");


while(count = read(0, buf, 16)) {
    write(f1, buf, count);
}

close(f1);
return 0;
}

これは私のコードです。引数として指定されたファイルを開き、ファイルの先頭にコンソールからすべてを書き込む必要があります。ファイルは追加モードで開かれ、lseek を使用して記述子を先頭に移動します。f1 の値に変更はなく、lseek が失敗したと出力されます。

4

1 に答える 1

2

ファイルが O_APPEND モードで開かれた場合、write() の呼び出しのたびに、オフセット ポインターはアトミック操作を処理するためにファイルの末尾に移動するためです。

これは、ファイルの末尾からのみとして、多くのプロセスがファイル (ログ ファイルなど) に「テキスト」を追加する目的で使用されていました。

したがって、コードを次のように変更してみてください。

O_RWONLY フラグでのみファイルを開きます (EOF をシークする必要がある場合は lseek() を使用します)。

open() で O_APPEND フラグを使用しないと、write() は呼び出しごとにオフセットを EOF に自動的に移動しませんでした。

于 2016-10-18T10:49:08.850 に答える