2009-03-06 10 views

Répondre

1

FlushViewOfFile

Commander le mmapmodule.c Python 2.6 pour un exemple de FlushViewOfFile et msync utilisé:

/* 
/Author: Sam Rushing <[email protected]> 
/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 [email protected] 
/
/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 
} 

MISE À JOUR: Je ne pense que vous allez trouver la parité complète dans les API de fichiers mappés win32. L'API FlushViewOfFile n'a pas de saveur synchrone (probablement à cause de l'impact possible du gestionnaire de cache). Si un contrôle précis sur le moment où les données sont écrites sur le disque est requis, vous pouvez peut-être utiliser les indicateurs FILE_FLAG_NO_BUFFERING et FILE_FLAG_WRITE_THROUGH avec l'API CreateFile lorsque vous créez le handle pour votre fichier mappé.

0

merci pour la réponse rapide. Je suis conscient de l'utilisation de mysnc et de FlushViewOfFile. Dans le code collé, nous pouvons voir en fonction de l'OS, nous appelons l'appel sys-msync correspondant [dans unix] et flushviewofFile [dans Windows]. Qu'est-ce que je cherche est un mécanisme où nous pouvons nous assurer que l'appel FlushViewofFile engage les modifications du disque dur avant de retourner:

De msdn docs de FlushViewofFile:

« Flushing une gamme d'une vue cartographiée initie l'écriture de sale Les pages sales dans cette plage sont celles dont le contenu a changé depuis la représentation du fichier La fonction FlushViewOfFile ne vide pas les métadonnées du fichier et n'attend pas de retour tant que les modifications ne sont pas effacées du disque matériel sous-jacent Cache et physiquement écrit sur le disque Pour vider toutes les pages sales plus les métadonnées pour le fichier et s'assurer qu'ils sont physiquement écrits sur le disque, appelez FlushViewOfFile, puis appelez la fonction FlushFileBuffers. " FlushFileBuffers() peut être utilisé à cette fin, mais cela n'est valide que sur un descripteur de fichier. Ce que j'ai est une région mappée en mémoire qui doit être validée sur le disque. Pour ce faire, j'ai d'abord cal FlushViewoffile en passant l'adresse de base et le nombre d'octets à vider. Msync réalise cela en un seul appel: vidage des tampons contenu/octet du fichier de données et validation sur le disque dur. Je voulais une fonctionnalité équivalente dans Windows.

+0

Salut Maximus_1986, j'ai écrit une petite mise à jour mais je ne pense pas que ça va beaucoup aider. Pardon. – yothenberg

0

Je suppose que FlushViewOfFile est la bonne chose. Quand je lis le man page for msync, je ne supposerais pas qu'il efface réellement le cache de disque (le cache dans l'unité de disque, par opposition au cache de système dans la mémoire principale). FlushViewOfFile ne retournera pas tant que la pile de disques n'aura pas terminé les écritures; Comme la documentation msync, elle ne dit rien de ce qui se passe dans le cache disque. Nous devrions probablement envisager de le rendre plus clair dans la documentation.

Questions connexes