Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get file descriptor of buffer in memory?

Tags:

c

If I have a buffer which contains the data of a file, how can I get a file descriptor from it? This is a question derived from how to untar file in memory

like image 211
solotim Avatar asked Oct 13 '09 07:10

solotim


People also ask

How do I find file descriptor?

Get the file descriptor from a FILE pointer (e.g. file ) in C on Linux: int fd = fileno(file); More details can be found in the man page of fileno : fileno manual .

How do I print a file descriptor?

You don't print a FILE* descriptor, it's a pointer to opaque data that is totally implementation dependent. Under Linux, You need to print the individual members of the file descriptor. For e.g. you have a file pointer FILE *fp to print the _flag use fp->_flag .

Where are the file descriptors stored?

File descriptors are an index into a file-descriptor table stored by the kernel. The kernel creates a file-descriptor in response to an open call and associates the file-descriptor with some abstraction of an underlying file-like object; be that an actual hardware device, or a file-system or something else entirely.

What is stored in a file descriptor?

A file descriptor is a number that uniquely identifies an open file in a computer's operating system. It describes a data resource, and how that resource may be accessed. When a program asks to open a file — or another data resource, like a network socket — the kernel: Grants access.


2 Answers

I wrote a simple example how to make filedescriptor to a memory area:

#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("");
}
like image 94
sambowry Avatar answered Oct 06 '22 00:10

sambowry


Not possible in plain C. In plain C all file access happens via FILE * handles and these can only be created with fopen() and freopen() and in both cases must refer to a file path. As C tries to be as portable as possible, it limits I/O to the absolute bare minimum that probably all systems can support in some way.

If you have POSIX API available (e.g. Linux, macOS, iOS, FreeBSD, most other UNIX systems), you can use fmemopen():

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

This is a true file handle that can be used with all C file API. It should also allow seeking, something not possible if you work with pipes as pipes support no seeking (you can emulate forward seeking but there is no way to ever seek backwards).

like image 34
Mecki Avatar answered Oct 06 '22 00:10

Mecki