2016-05-17 11 views
0

я могу открыть объем "исключительно" с CreateFile, установив dwShareMode 0:Исключительное открытие тома

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

Я могу открыть объем в "общий режим" с FOPEN:

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

I может открыть файл «исключительно» с открытым:

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

Однако, если я пытаюсь открыть тома с открытым, он не сможет:

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

После тестирования это происходит с флагом O_EXCL или без него. Является эксклюзивным томом что-то, что можно сделать только с CreateFile, или я пропустил что-то?

+1

Per https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx 'O_EXCL' не означает «эксклюзивный доступ». Это не эквивалент 'dwShareMode = 0'. Он используется с 'O_CREAT', чтобы открыть файл, только если он еще не существует. –

+2

Для записи, вероятно, неразумно использовать функции ввода-вывода C с томами. Они не предназначены для этого. –

ответ

0

По the standard:

результат не определен, если O_RDWR применяется к FIFO

Это кажется, что объем распознается как FIFO в этой ситуации. Чтобы исправить:

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

Или:

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

Или:

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