是否有一个Windows相当于HANDLE的fdopen?
在Unix中,如果你有一个文件描述符(例如从一个套接字,pipe道或从你的父进程inheritance),你可以用fdopen(3)
打开一个缓冲的I / O FILE*
stream。
在Windows上是否有相同的HANDLE
? 如果你有一个从你的父进程(与stdin,stdout或stderr不同)inheritance的HANDLE
或CreatePipe
一个pipe道,是否有可能从它获得缓冲的FILE*
stream? MSDN不logging_fdopen
,但是与_open
返回的整型文件描述符一起使用,而不是genericsHANDLE
。
不幸的是, HANDLE
是与FILE*
和文件描述符完全不同的。 CRT最终用HANDLE
处理文件,并将这些HANDLE
与文件描述符相关联。 这些文件描述符依次由FILE*
结构指针。
幸运的是,在这个MSDN页面上有一节介绍了“提供一种方法来改变FILE结构,文件描述符和Win32文件句柄之间文件的表示forms”:
_fdopen
,_wfdopen
:将stream与先前为低级别I / O打开的文件关联,并返回指向打开stream的指针。_fileno
:获取与stream关联的文件描述符。_get_osfhandle
:返回与现有C运行时文件描述符相关的操作系统文件句柄_open_osfhandle
:将C运行时文件描述符与现有的操作系统文件句柄相关联。
看起来你需要的是_open_osfhandle
后跟_fdopen
从HANDLE
获取FILE*
。
这是一个涉及从CreateFile()
获取的HANDLE
的例子。 当我testing它时,它显示文件“test.txt”的前255个字符,并在文件末尾附加“— Hello World!—”
#include <windows.h> #include <io.h> #include <fcntl.h> #include <cstdio> int main() { HANDLE h = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(h != INVALID_HANDLE_VALUE) { int fd = _open_osfhandle((intptr_t)h, _O_APPEND | _O_RDONLY); if(fd != -1) { FILE* f = _fdopen(fd, "a+"); if(f != 0) { char rbuffer[256]; memset(rbuffer, 0, 256); fread(rbuffer, 1, 255, f); printf("read: %s\n", rbuffer); fseek(f, 0, SEEK_CUR); // Switch from read to write const char* wbuffer = " --- Hello World! --- \n"; fwrite(wbuffer, 1, strlen(wbuffer), f); fclose(f); // Also calls _close() } else { _close(fd); // Also calls CloseHandle() } } else { CloseHandle(h); } } }
这应该也适用于pipe道。