2016-05-17 2 views
0

Je peux ouvrir un volume "exclusivement" avec CreateFile en mettant dwShareMode à 0:ouverture du volume exclusif

#include <windows.h> 
int main() { 
    HANDLE ki = CreateFile("\\\\.\\F:", GENERIC_READ | GENERIC_WRITE, 0, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
} 

Je peux ouvrir un volume en mode "partagé" avec fopen:

#include <stdio.h> 
int main() { 
    FILE* ki = fopen("\\\\.\\F:", "r+b"); 
} 

I peut ouvrir un fichier « exclusivement » avec ouvert:

#include <stdio.h> 
#include <fcntl.h> 
int main() { 
    int ju = open("lima.txt", O_RDWR | O_EXCL); 
    FILE* ki = fdopen(ju, "r+b"); 
} 

Cependant, si je tente d'ouvrir un volume avec ouvert, il échouera:Après le test, cela se produit avec ou sans l'indicateur O_EXCL. Est-ce que le volume exclusif ouvre quelque chose qui ne peut être fait qu'avec CreateFile, ou est-ce que je manque quelque chose?

+1

Par https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx 'O_EXCL' ne signifie pas "accès exclusif". Ce n'est pas un équivalent de 'dwShareMode = 0'. Il est utilisé avec 'O_CREAT' pour ouvrir un fichier seulement s'il n'existe pas déjà. –

+2

Pour mémoire, il est probablement imprudent d'utiliser des fonctions d'E/S d'exécution C avec des volumes. Ils ne sont pas conçus pour ça. –

Répondre

0

Selon the standard:

résultat est indéfini si O_RDWR est appliqué à une FIFO

Il semble qu'un volume est reconnu comme un FIFO dans cette situation. Pour corriger:

open("\\\\.\\F:", O_RDONLY); 

Ou:

open("\\\\.\\F:", O_WRONLY); 

Ou:

open("\\\\.\\F:", O_RDONLY | O_WRONLY);