2016-07-10 20 views
0

ほとんどのファイルシステムでは、同時読み書きを処理するためにロックが使用されます。しかし、読み込み呼び出しの後に書き込みコールが実行された場合、は前回の読み込み呼び出しの前にデータを削除します。ファイルシステムでの同時読み込み/書き込みによるデータ削除

小さいファイルの新しい開始点を反映するために、読み込み用に開いたファイルのポインタが更新されていますか?

答えて

1

データを書き込みシステムコールを使用して削除できないため、質問は実際には有効ではありません。 は、write(2)システムコールを使用してデータを上書きできますが、データを削除することはできません。これで、truncate(2)システムコールを使用してファイルを切り捨てることができます。これによりファイルのサイズが変更され(stat(2)システムコールによってst_sizeフィールドを介して報告されます)、変更されたst_sizeによって報告されたファイルの終了後のバイトはゼロになります。 truncateシステムコールを使用してファイルのサイズを増やすには、現在のサイズより大きい新しいサイズを要求します。これが許可されているかどうか、またはファイルの現在のサイズより大きな切り捨てを受け取ったときにシステムが何を行うかは、POSIX仕様では未定義です。多くのファイルシステムでは、ファイルのサイズを要求されたサイズに設定するだけです。

OK、いくつかの概念。開いている各ファイル構造には、ファイルオフセットポインタが関連付けられています。 read(2)またはwrite(2)システムコールを使用してファイルを読み書きしようとすると、オフセットポインタは読み書きされたバイト数だけ前進します。 open(2)システムコールを使用してファイルを2回開くと、それぞれ異なるオープンファイル構造を参照する2つのファイル記述子が得られます。その場合、1つのファイルを使用するread(2)またはwrite(2)ディスクリプタは、他のファイルディスクリプタのファイルオフセットを変更しません。 (dup(2)システムコールを使用してファイルディスクリプタをクローンすると、同じファイル構造を指す2番目のファイルディスクリプタが取得され、1つのファイルディスクリプタを介してファイル構造に加えられた変更は、 2)、またはlseek(2)システムコールは、クローンファイル記述子を介して反映されますが、それは副次的な問題です。ファイルを切り捨てると、ファイル記述子のファイルオフセットは変更されません。ただし、切り捨てられたサイズの後のバイトは、読み込まれるとゼロになります。したがって、ファイルオフセットポインタは切り捨てられた後には更新されませんが、ファイルの切り捨てられたサイズを超えて読み取ると、すべてゼロが返されます。

+0

ご提案いただきありがとうございます。だからファイル記述子のオフセットを更新するには、私はそれをdup2してから、そのdupされたfdのファイルオフセットを私が望むところに向けることができます。 UNIXのファイルディスクリプタテーブルにアクセスする方法はありますか? – pqx994

+0

切り捨ては機能しません - 以前の読み込み呼び出しのファイルオフセットに先行するデータを削除したいと思います。 – pqx994

+0

「システムレベルのファイルから既に読み込まれたデータを消去する」ことについて質問した人物でもあることを、ちょうど覚えました。違反はありませんが、あなたは本当にこれに間違った木を鳴らしています.... –

関連する問題