子进程是否可以读取被父进程锁定的文件?

Is it possible for a child process to read a file which is locked by parent process?

我有一个父进程,它使用 CreateFile() 创建一个文件并将其锁定。下面是代码:

m_hWriterLockFile = ::CreateFile("C:\Test.txt", 
                             GENERIC_READ | GENERIC_WRITE, 
                             0, // exclusive
                             NULL, // default security
                             OPEN_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);

现在,我只想让子进程访问这个锁定的文件。我不希望任何其他进程读取此文件。

我已经创建了一个子进程。下面是示例代码:

// Initialize a security attributes structure.
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
    if (!CreateProcess("FileReader.exe", // I want to invoke this exe
    "C:\Test.txt",
    &sa,
    NULL,
    TRUE,
    0,
    NULL,
    NULL,
    &si,
    &pi))
{
    std::cout << "Create Process Faild (%d) " << GetLastError() << '\n';
}

不幸的是,我无法实现我的目标,有没有人可以帮助我?还有其他方法可以实现这一目标吗?如果需要,我会分享更多信息(代码)。

注意:我没有分享完整的代码来缩短 post。

这是我的问题的答案:

创建具有可继承句柄的文件并将该句柄传递给子进程。一种简单的方法是将其作为命令行参数传递。我们必须将一个 SECURITY_ATTRIBUTES 结构传递给 CreateFile 并将 bInheritHandle 指定为 TRUE,并将 TRUE 传递给调用 CreateProcess 的 bInheritHandles 参数。

创建文件

例如:

    SECURITY_ATTRIBUTES sa{ sizeof sa, nullptr, TRUE };
HANDLE hFile = CreateFileA("C:\Test.txt",
    GENERIC_READ | GENERIC_WRITE,
    0,
    &sa,
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL);

子进程:

UINT_PTR uiHandle = reinterpret_cast<UINT_PTR>(hFile);

        sprintf_s(szCmdLine, "\"%s\" %Iu", szExePath, uiHandle);

        if (CreateProcessA(nullptr,
            szCmdLine,
            nullptr,
            nullptr,
            TRUE,
            CREATE_NEW_CONSOLE,
            nullptr,
            nullptr,
            &si,
            &pi))
        {
           CloseHandle(pi.hThread);
           CloseHandle(pi.hProcess);

        }