I’m writing a straightforward C program on Linux and wish to use an existing library’s API which expects data from a file. I must feed it a file name as a const char*. But i have data, just like content of a file, already sitting in a buffer allocated on the heap. There is plenty of RAM and we want high performance. Wanting to avoid writing a temporary file to disk, what is a good way to feed the data to this API in a way that looks like a file?
Here’s a cheap pretend version of my code:
marvelouslibrary.h:
int marvelousfunction(const char *filename);
normal-persons-usage.cpp, for which library was originally designed:
#include 'marvelouslibrary.h' int somefunction(char *somefilename) { return marvelousfunction(somefilename); }
myprogram.cpp:
#include 'marvelouslibrary.h' int one_of_my_routines() { byte* stuff = new byte[1000000]; // fill stuff[] with...stuff! // stuff[] holds same bytes as might be found in a file /* magic goes here: make filename referring to stuff[] */ return marvelousfunction( ??? ); }
To be clear, the marvelouslibrary does not offer any API functions that accept data by pointer; it can only read a file.
I thought of pipes and mkfifo(), but seems meant for communicating between processes. I am no expert at these things. Does a named pipe work okay read and written in the same process? Is this a wise approach?
Or skip being clever, go with plan ‘B’ which is to shuddup and just write a temp file. However, i’d like to learn something new and find out what’s possible in this situation, beside getting high performance.
Given that you likely have a function like:
I think you will need to ‘skip being clever, go with plan ‘B’ which is to shuddup and just write a temp file.’
If you can dig around and find out if the call you are making is calling another function that takes a File * or an int for the file descriptor then you can do something better.
One thought that does come to mind, can you cahnge your code to write to a memory mapped file instead of to the heap? That way you would have a file on disk already and you would avoid the copying (though it’ll still be on disk) and you can still give the function call the file name.