首页 > Windows开发 > 详细

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

时间:2021-04-27 19:43:04      阅读:17      评论:0      收藏:0      [点我收藏+]

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下,子进程占用父进程文件句柄问题

原文:https://www.cnblogs.com/beweirdo/p/14708884.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!