3

フラグを使用してO_DIRECT、ユーザー バッファーから直接ディスクに書き込みます。しかし、私の知る限り、Linux はこの呼び出しの後にデータが書き込まれることを保証していません。DMA などを使用して、ユーザー バッファーから物理デバイスに直接書き込むだけです。したがって、「書き込み」関数の呼び出し後にユーザー バッファーに書き込めるかどうかわかりません。

サンプルコードが私の質問を理解するのに役立つと確信しています:

char *user_buff = malloc(...); /* assume it is aligned as needed */
fd = open(..., O_DIRECT);
write(fd, ...)
memset(user_buff, 0, ...)

最後の行 (memset) は有効ですか? データをデバイスに転送するために DMA によって使用される可能性があるユーザー バッファへの書き込みは有効ですか?

4

2 に答える 2

2

それは合法です。ここでは「ループバック」は発生しません。動的に誤って配置された配列を使用した場合の対処方法を検討してください。後で解放してもらえますwrite()か?できませんでしたか?-答えは、write()関数(およびsyscall)が戻った後、ユーザーバッファーを変更したり、ユーザーバッファーにアクセスしたりしないことです。-即時書き込みを実行できなかった場合は、データのコピーが作成されます。実装の詳細について心配する必要はありません(結局のところ、C標準ライブラリを持つことの目的です...)

于 2012-12-01T11:04:05.060 に答える
1

O_SYNCフラグを と組み合わせて使用​​しO_DIRECTます。そうすれば、戻ったときにデータが書き込まれていることを確認できwrite()ます。

于 2012-12-01T11:29:58.620 に答える