Windows の msync [unix sys call] に相当するものは何ですか? C、C++ スペースで MSDN API を探しています。msync の詳細については、http://opengroup.org/onlinepubs/007908799/xsh/msync.htmlを参照してください。
3 に答える
FlushViewOfFile
FlushViewOfFile と msync の使用例については、Python 2.6 mmapmodule.c を参照してください。
/*
/ Author: Sam Rushing <rushing@nightmare.com>
/ Hacked for Unix by AMK
/ $Id: mmapmodule.c 65859 2008-08-19 17:47:13Z thomas.heller $
/ Modified to support mmap with offset - to map a 'window' of a file
/ Author: Yotam Medini yotamm@mellanox.co.il
/
/ mmapmodule.cpp -- map a view of a file into memory
/
/ todo: need permission flags, perhaps a 'chsize' analog
/ not all functions check range yet!!!
/
/
/ This version of mmapmodule.c has been changed significantly
/ from the original mmapfile.c on which it was based.
/ The original version of mmapfile is maintained by Sam at
/ ftp://squirl.nightmare.com/pub/python/python-ext.
*/
static PyObject *
mmap_flush_method(mmap_object *self, PyObject *args)
{
Py_ssize_t offset = 0;
Py_ssize_t size = self->size;
CHECK_VALID(NULL);
if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size))
return NULL;
if ((size_t)(offset + size) > self->size) {
PyErr_SetString(PyExc_ValueError, "flush values out of range");
return NULL;
}
#ifdef MS_WINDOWS
return PyInt_FromLong((long) FlushViewOfFile(self->data+offset, size));
#elif defined(UNIX)
/* XXX semantics of return value? */
/* XXX flags for msync? */
if (-1 == msync(self->data + offset, size, MS_SYNC)) {
PyErr_SetFromErrno(mmap_module_error);
return NULL;
}
return PyInt_FromLong(0);
#else
PyErr_SetString(PyExc_ValueError, "flush not supported on this system");
return NULL;
#endif
}
更新: win32 マップ ファイル API で完全な同等性を見つけることはできないと思います。FlushViewOfFile API には同期フレーバーがありません (おそらく、キャッシュ マネージャーの影響が考えられるためです)。データがディスクに書き込まれるタイミングを正確に制御する必要がある場合は、マップされたファイルへのハンドルを作成するときに、CreateFile APIでフラグFILE_FLAG_NO_BUFFERING
とフラグを使用できますか?FILE_FLAG_WRITE_THROUGH
FlushViewOfFile は実際には正しいことだと思います。msyncのマニュアル ページを読んだとき、実際にディスク キャッシュ (メイン メモリのシステム キャッシュではなく、ディスク ユニットのキャッシュ) をフラッシュしているとは思いませんでした。
FlushViewOfFile は、ディスク スタックが書き込みを完了するまで戻りません。msync のドキュメントと同様に、ディスク キャッシュで何が起こるかについては何も述べていません。おそらく、ドキュメントでそれをより明確にすることを検討する必要があります。