VC++的文件描述符和内核文件句柄HANDLE

VC++的文件描述符和内核文件句柄HANDLE

本文描述VC++中的C语言使用代码文件描述符(file descriptor),和内核文件句柄HANDLE之间关系,以及两者之间的转换函数_get_osfhandle,_open_osfhandle以及使用他们的风险。在Windows代码中代码中间文件描述符号和内核句柄HANDLE千万不要共用。

在文章的开头,要声明这是我写的bug,但是是被两个小伙子derickhu,Sasukeliu发现了在此再次对它们表示感谢。

去年在写一些跨平台代码的时候,我们在Windows下尽量模拟一下POSIX(Linux),的函数,结果发现一个问题,如果希望使用到Windows下使用更多的功能,你必须使用内核的文件句柄HANDLE,而不能VC++中C语言函数open等使用的文件描述符(file descriptor),也就是int。到为了方便跨平台,我尽量希望接口是统一的,我们实现的如下:

//我们的垮平台代码
ZEN_HANDLE ZEN_OS::open (const char *filename,
                         int open_mode,
                         mode_t perms)

ZEN_HANDLE在多个WINDOWS平台下被定义为Windows的内核句柄HANDLE,而在LINUX下被定义为LINUX的内核句柄int。

而VC++默认的确实现了一个符合POSIX标准的open函数,返回值也是标准的文件描述符int

//WINDOWS下实现的open函数
int _open(
   const char *filename,
   int oflag [,
   int pmode] 
);

那么如果有一个方法能从C语言的文件描述符转换到Windows内核句柄,那么我就可以直接利用_open这个函数了。Google发现了这两个函数_get_osfhandle,_open_osfhandle。当时的理解是_get_osfhandle将文件描述符号转换成HANDLE,_open_osfhandle将HANDLE转换文件描述符。


//
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值