最近在项目中遇到一个问题,在windows下 用 _popen
方法创建管道,会导致子进程继承父进程文件句柄,导致父进程文件句柄被占用,从而导致日志文件重命名失败,最后设置可继承属性后解决了,记录下
在打开文件句柄处设置可被继承属性
::_wsopen_s(&file, fileName, _O_CREAT | _O_WRONLY | _O_BINARY, _SH_DENYWR, _S_IREAD |
_S_IWRITE);
//设置文件句柄可被继承标志为0(不能被继承)
SetHandleInformation((HANDLE)_get_osfhandle(file), HANDLE_FLAG_INHERIT, 0);
CreateProcess 创建子进程设置不可继承属性
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
bInheritHandles
指示新进程是否从调用进程处继承了句柄。
如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。
已知:
CreateFile返回的是HANDLE,
fopen返回的是FILE *,
_open返回的是个int,
FILE * => int
Gets the file descriptor associated with a stream.
int _fileno(
FILE *stream
);
int => HANDLE
Returns operating-system file handle associated with existing low-level file descriptor.
long _get_osfhandle(
int fd
HANDLE => int
Associates a C run-time file descriptor with an existing operating-system file handle.
int _open_osfhandle (
intptr_t osfhandle,
int flags
);
参考:
原文:https://www.cnblogs.com/beweirdo/p/14708884.html