是否有一个Windows相当于HANDLE的fdopen?

在Unix中,如果你有一个文件描述符(例如从一个套接字,pipe道或从你的父进程inheritance),你可以用fdopen(3)打开一个缓冲的I / O FILE*stream。

在Windows上是否有相同的HANDLE ? 如果你有一个从你的父进程(与stdin,stdout或stderr不同)inheritance的HANDLECreatePipe一个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后跟_fdopenHANDLE获取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道。