Windows中子进程能否读取父进程加锁的文件?如何仅允许子进程访问?
实现仅父子进程访问加锁文件的解决方案
现有代码问题说明
你当前的实现存在两个核心问题:
- 调用
CreateFile时传入的安全属性为NULL,默认生成的文件句柄是不可继承的,就算CreateProcess开启了句柄继承开关,子进程也拿不到该文件句柄。 CreateFile的第三个参数设为0开启了独占模式,此时所有其他进程(包括你创建的子进程)都无法再通过CreateFile新打开该文件,所以子进程自行调用CreateFile打开文件一定会失败。
可选实现方案
方案一:句柄继承+独占模式(实现简单,安全性高)
这种方式下其他进程完全无法新打开该文件,只有父子进程可以通过已打开的句柄操作文件:
- 修改父进程
CreateFile的安全属性配置,开启句柄可继承:
SECURITY_ATTRIBUTES fileSa = {0}; fileSa.nLength = sizeof(SECURITY_ATTRIBUTES); fileSa.bInheritHandle = TRUE; // 允许该文件句柄被子进程继承 fileSa.lpSecurityDescriptor = NULL; m_hWriterLockFile = ::CreateFile("C:\\Test.txt", GENERIC_READ | GENERIC_WRITE, 0, // 保留独占模式,禁止所有其他进程新打开该文件 &fileSa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- 创建子进程时保持
bInheritHandles参数为TRUE(你的现有代码已经符合要求),将文件句柄的值转为字符串作为命令行参数传给子进程。 - 子进程启动后直接从命令行读取句柄值,不需要再调用
CreateFile,直接用该句柄进行读写操作即可。 - 额外安全增强:可以给文件配置DACL(自主访问控制列表),只允许当前进程所属的用户账号拥有访问权限,避免管理员账号越权访问。
方案二:IPC中转(隔离性更强,安全级别最高)
如果不希望子进程直接接触文件句柄,可以通过进程间通信做访问中转:
- 父进程保留现有
CreateFile的独占模式,不需要开启句柄继承。 - 父子进程之间通过命名管道、共享内存+信号量等IPC方式通信,子进程需要读写文件时向父进程发送请求,父进程完成实际的文件读写后将结果返回给子进程。
- 这种方式下所有文件操作的控制权都在父进程,适合对安全要求极高的场景。
内容的提问来源于stack exchange,提问作者Praveer Kumar
相关产品推荐
相关产品推荐

