子进程是否可以读取被父进程锁定的文件?
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);
}
我有一个父进程,它使用 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);
}