4

CreateFile() 可以在两个不同的线程中同时打开一个文件吗


void new_function(void * what) {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | 
                  FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (h == INVALID_HANDLE_VALUE)
{
    DWORD d = GetLastError();
    return ;
}
Sleep(10000);

}

int main() {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Sleep(10000);
return 1;

}


每次它在该GetLastError位置退出。并且错误是ERROR_SHARING_VIOLATION(32,“该进程无法访问该文件,因为它正在被另一个进程使用。”)

如果我无法共享打开文件,那么文件的用途是什么FILE_SHARE_WRITE | FILE_SHARE_READ

谢谢

The program environment is Win32 Vs2003

4

1 回答 1

12

文件句柄总是在线程之间共享。您需要做的只是正常使用句柄,但在两个线程上。

您的第二次调用CreateFile()失败,因为您请求的访问权限GENERIC_ALL, 超过了您允许的共享访问权限 , FILE_SHARE_WRITE | FILE_SHARE_READ

如果您改为请求 only GENERIC_READ | GENERIC_WRITE,它将成功。

CreateFile()如果您在单个线程上调用它,行为将是相同的。

于 2009-10-16T05:15:39.590 回答