【发布时间】:2018-05-22 01:00:55
【问题描述】:
我想让 2 个进程写入同一个文件。我在第一个进程(父进程)中创建了一个文件并调用了第二个进程(子进程)。我已使文件可继承,第二个进程将句柄作为命令行参数继承。
虽然句柄不等于 INVALID_HANDLE_VALUE,但第二个进程不能对文件做任何事情。 WriteFile() 以错误 6 结束(句柄无效)。 LockFile(),Unlockfile() 也是如此。
代码有什么问题,我该如何解决?我想让 2 个进程使用同一个文件。
流程一:
#include <Windows.h>
#include <process.h>
int _tmain(int argc, _TCHAR* argv[])
{
_SECURITY_ATTRIBUTES sec_attr;
sec_attr.nLength = sizeof(_SECURITY_ATTRIBUTES);
sec_attr.bInheritHandle = true;
sec_attr.lpSecurityDescriptor = 0;
//argv[1] - the name of the file I want to create
HANDLE h = CreateFile(argv[1],GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE |
FILE_SHARE_READ,&sec_attr,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
STARTUPINFO sinfo;
ZeroMemory(&sinfo,sizeof(sinfo));
sinfo.cb = sizeof(sinfo);
PROCESS_INFORMATION pinfo;
char cmd[300] = "PATH to process 2";
CreateProcess(0,cmd,0,0,true,NORMAL_PRIORITY_CLASS,0,0,&sinfo,&pinfo);
char c = '1';
DWORD w;
WriteFile(h,&c,1,&w,0); //works fine
...
}
流程2:
#include <Windows.h>
#include <process.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE h = argv[1];
if(h == INVALID_HANDLE_VALUE) {
//it's okay, h is NOT equal to INVALID_HANDLE_VALUE
}
char c = '2';
DWORD w;
WriteFile(h,&c,1,&w,0); //error 6
...
}
附:第一个进程成功写入文件。到那时,第二个进程已经失败了。
【问题讨论】:
-
把句柄的值传给子进程在哪里?
HANDLE h = argv[1];也不正确,您将字符串 pointer 分配给句柄。您应该将字符串 value 转换为句柄。 -
如果你得到
ERROR_INVALID_HANDLE- 这意味着子进程错误地获取句柄值。反正HANDLE h = argv[1];是错的 -
@zett42 HANDLE 的定义类似于 typedef void* HANDLE。 argv[1] 不应该轻松转换为 void* 吗?如果是错误的,我应该如何转换它?
-
@RbMm 没有 ERROR_INVALID_HANDLE。第二个过程中的 WriteFile() 只是没有在文件中写入字符,我通过 GetLastError() 函数得到了错误号。令人困惑的是 h != INVALID_HANDLE_VALUE,但是 WriteFile() 抱怨句柄无效
-
可以,但是需要告诉子进程句柄值。您已经尝试在子进程中从
argv[1]读取句柄,因此您必须从父进程通过命令行传递句柄值。