windows下,子进程占用父进程文件句柄问题
最近在项目中遇到一个问题,在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 );
参考: