Подтвердить что ты не робот

Как получить файловый дескриптор буфера в памяти?

Если у меня есть буфер, содержащий данные файла, как я могу получить из него дескриптор файла? Это вопрос, полученный из как распаковать файл в памяти

4b9b3361

Ответ 1

Я написал простой пример, как сделать 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("");
}

Ответ 2

Невозможно на простом C. В простом C все обращения к файлам осуществляются через дескрипторы FILE * и они могут быть созданы только с помощью fopen() и freopen() и в обоих случаях должны указывать путь к файлу. Поскольку C пытается быть максимально переносимым, он ограничивает ввод-вывод абсолютным минимальным значением, которое, возможно, все системы могут каким-либо образом поддерживать.

Если у вас есть API POSIX (например, Linux, macOS, iOS, FreeBSD, большинство других систем UNIX), вы можете использовать fmemopen():

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

Это настоящий дескриптор файла, который можно использовать со всеми API-интерфейсами C файлов. Также следует разрешить поиск, что невозможно, если вы работаете с трубами, так как каналы не поддерживают поиск (вы можете эмулировать поиск вперед, но нет способа когда-либо искать назад).

Ответ 3

Вы не можете. В отличие от С++, модель ввода-вывода файлов C не открыта для расширения.