如何在内存中获取缓冲区的文件描述符?

sol*_*tim 14 c

如果我有一个包含文件数据的缓冲区,我该如何从中获取文件描述符?这是一个从内存中解压缩文件的问题

sam*_*wry 13

我写了一个简单的例子,说明如何将filedescriptor放到内存区域:

#include <unistd.h>
#include <stdio.h> 
#include <string.h> 

char buff[]="qwer\nasdf\n";

int main(){
  int p[2]; pipe(p);

  if( !fork() ){
    for( int buffsize=strlen(buff), len=0; buffsize>len; )
      len+=write( p[1], buff+len, buffsize-len );
    return 0;
  }

  close(p[1]);
  FILE *f = fdopen( p[0], "r" );
  char buff[100];
  while( fgets(buff,100,f) ){
    printf("from child: '%s'\n", buff );
  }
  puts("");
}
Run Code Online (Sandbox Code Playgroud)

  • @Mecki,从手册页中可以看出,当调用从“fmemopen()”返回的“FILE*”时,“fileno()”将返回“-1”。 (3认同)
  • 在 Linux 上,[`vmsplice()`](http://man7.org/linux/man-pages/man2/vmsplice.2.html) 可能很有用:它避免了 for 循环将数据写入到管道。 (2认同)
  • 你为什么不选择`fmemopen()`?是的,它是 POSIX 而不是 C,但 `pipe()` 也是 POSIX,不是吗? (2认同)

Mec*_*cki 5

在普通 C 中不可能。在普通 C 中,所有文件访问都通过FILE *句柄进行,并且只能使用 和 创建fopen(),并且freopen()在两种情况下都必须引用文件路径。由于 C 试图尽可能地实现可移植,因此它将 I/O 限制在可能所有系统都可以以某种方式支持的绝对最低限度。

如果您有可用的 POSIX API(例如 Linux、macOS、iOS、FreeBSD、大多数其他 UNIX 系统),您可以使用fmemopen()

char dataInMemory[] = "This is some data in memory";
FILE * fileDescriptor = fmemopen(dataInMemory, sizeof(dataInMemory), "r");
Run Code Online (Sandbox Code Playgroud)

这是一个真正的文件句柄,可以与所有 C 文件 API 一起使用。它还应该允许查找,如果您使用管道,则这是不可能的,因为管道不支持查找(您可以模拟向前查找,但无法向后查找)。