Как получить файловый дескриптор буфера в памяти? - PullRequest
13 голосов
/ 13 октября 2009

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

Ответы [ 3 ]

13 голосов
/ 13 октября 2009

Я написал простой пример того, как сделать дескриптор файла в области памяти:

#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 голосов
/ 17 января 2019

Невозможно на простом 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-файлов. Также следует разрешить поиск, что невозможно, если вы работаете с каналами, поскольку каналы не поддерживают поиск (вы можете эмулировать поиск вперед, но нет способа когда-либо искать назад).

0 голосов
/ 13 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...