10

Linuxでsyscallの読み取り/書き込みがどのように行われたかを調べていたところ、次のことがわかりました。

....
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
...`

私の質問は次のとおりです。

ロックはどこへ行った?私は次のようなものを想像していたでしょう:

....
lock(f.file);  // <-- lock file struct
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
unlock(f.file);  // <-- unlock file struct
...

複数のスレッドが同時に読み取り/書き込みを試みた場合、それらは同じオフセットで読み取り/書き込みを行うことができますか?

私の理解が正しければ、Linux はオフセットを保護するためにロック メカニズムを使用しません。これは POSIX に準拠していますか?

私は POSIX 仕様を調べましたが、このケースについては何も見つかりませんでした。

4

2 に答える 2

7

Linux は、ファイルへのマルチスレッド書き込みを保護するためにロック メカニズムを使用しません。

ファイルを保護するには、独自のミューテックスを使用する必要があります。

于 2013-01-30T09:22:16.510 に答える
4

マルチスレッド アプリケーションでは、ファイル記述子へのアクセスをシリアル化する必要があります。プロセス全体で、flock(2)syscall を使用して同じファイルへのアクセスを同期できます。

2 つの異なるプロセス/スレッドから同じファイルにアクセスしても、カーネルはクラッシュしませんが、ファイルの位置とファイル データを未定義の方法で上書きまたは破損する可能性があります。

于 2013-01-30T09:46:11.213 に答える