windows下,子进程占用父进程文件句柄问题

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,

  1. FILE * => int

      Gets the file descriptor associated with a stream.
      
      int _fileno( 
         FILE *stream 
      );
    
  2. int => HANDLE

    Returns operating-system file handle associated with existing low-level file descriptor.
    
    long _get_osfhandle( 
       int fd 
    
  3. HANDLE => int

    Associates a C run-time file descriptor with an existing operating-system file handle.
    
    int _open_osfhandle (
       intptr_t osfhandle,
          int flags 
    );
    

参考:

windows下,子进程占用父进程文件句柄问题

上一篇:一个WPF下的虚拟键盘实现


下一篇:Windows2012系统安装IIS提示“服务器管理器WinRM插件可能已损坏或丢失解决