Windows中的msync等价物

时间:2009-03-06 08:20:24

标签: windows unix msdn

windows中msync [unix sys call]的等价物是什么?我在c,C ++空间中寻找MSDN api。 有关msync的更多信息,请访问http://opengroup.org/onlinepubs/007908799/xsh/msync.html

3 个答案:

答案 0 :(得分:1)

FlushViewOfFile

查看Python 2.6 mmapmodule.c以获取正在使用的FlushViewOfFile和msync的示例:

/*
 /  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_BUFFERINGFILE_FLAG_WRITE_THROUGH标志?

答案 1 :(得分:0)

我怀疑FlushViewOfFile实际上是正确的。当我读到man page for msync时,我不会认为它实际上正在刷新磁盘缓存(磁盘单元中的缓存,而不是主存储器中的系统缓存)。

在磁盘堆栈完成写入之前,FlushViewOfFile不会返回;与msync文档一样,它没有说明磁盘缓存中发生的事情。我们应该看看在文档中更清楚地说明这一点。

答案 2 :(得分:0)

相当于刷新所有文件映射的Windows

void FlushToHardDrive(LPVOID fileMapAddress,HANDLE hFile)
{
    FlushViewOfFile(fileMappAddress,0); //Async flush of dirty pages
    FlushFileBuffers(hFiles); // flush metadata and wait 
}

用于刷新部分文件映射

void FlushToHardDrive(LPVOID address,DWORD size, HANDLE hFile)
{
    FlushViewOfFile(address,size); //Async flush of region
    FlushFileBuffers(hFiles); // flush metadata and wait 
}

这在MSDN here

中有描述

标记FILE_FLAG_NO_BUFFERING实际上不对内存映射文件(描述为here)起任何作用,甚至文件句柄也使用这些标志创建,文件的元数据可以被缓存而不能已刷新,因此如果要完全确保已保存所有数据(包括文件访问时间),则IO和MM始终需要FlushFileBuffers。 here

对此行为进行了描述

P.S。一个真实的例子:SQLite几乎仅对reading使用MM文件,因此,当您使用MM文件进行写入/更新时,您需要了解此方案的所有副作用