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转换文件描述符。
//