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

时间:2009-10-13 07:55:07

标签: c

如果我有一个包含文件数据的缓冲区,我该如何从中获取文件描述符? 这是一个源自how to untar file in memory

的问题

3 个答案:

答案 0 :(得分: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("");
}

答案 1 :(得分:2)

在普通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");

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

答案 2 :(得分:0)

你做不到。与C ++不同,文件I / O的C模型不对扩展开放。