подача данных в C API, ожидающий имя файла - PullRequest
3 голосов
/ 01 марта 2009

Я пишу простую программу на C для Linux и хочу использовать API существующей библиотеки, которая ожидает данные из файла. Я должен указать имя файла как const char *. Но у меня есть данные, как содержимое файла, которые уже находятся в буфере, выделенном в куче. Существует много оперативной памяти, и мы хотим высокую производительность. Желая избежать записи временного файла на диск, каков хороший способ подачи данных в этот API в виде файла?

Вот дешевая притворная версия моего кода:

marvelouslibrary.h:

int marvelousfunction(const char *filename);

normal-Person-Use.cpp, для которого изначально была разработана библиотека:

#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( ??? );
}

Для ясности, marvelouslibrary не предлагает никаких функций API, которые принимают данные по указателю; он может только читать файл.

Я думал о pipe и mkfifo (), но, похоже, предназначен для связи между процессами. Я не эксперт в этих вещах. Работает ли именованный канал в порядке чтения и записи в одном и том же процессе? Это мудрый подход?

Или пропустите ум, перейдите с планом "B", который должен shuddup и просто написать временный файл. Тем не менее, я хотел бы узнать что-то новое и выяснить, что возможно в этой ситуации, помимо достижения высокой производительности.

Ответы [ 5 ]

3 голосов
/ 01 марта 2009

Учитывая, что у вас, скорее всего, есть такая функция:

char *read_data(const char *fileName)

Я думаю, что вам нужно будет "пропустить ум, перейдите к плану" B ", который заключается в shuddup и просто написать временный файл."

Если вы можете покопаться и выяснить, вызывает ли ваш вызов другую функцию, которая принимает File * или int для дескриптора файла, тогда вы можете сделать что-то лучше.

Одна мысль, которая приходит на ум, можете ли вы изменить свой код для записи в файл с отображением памяти вместо кучи? Таким образом, у вас уже будет файл на диске, и вы избежите копирования (хотя он все еще будет на диске), и вы все равно можете дать функции вызов файла с именем.

2 голосов
/ 01 марта 2009

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

Если вы не хотите взламывать библиотеку и функция хочет строку (путь к файлу), попробуйте сделать временный файл в /dev/shm.

В противном случае, mmap может быть лучшим вариантом, пожалуйста, изучите posix_madvise () при использовании mmap () (или его аналога posix_fadvise () при использовании временного файла).

Похоже, для начала вы говорите об очень небольшом количестве данных, поэтому я не думаю, что вы увидите влияние на производительность при любом маршруте.

Редактировать

Извините, я просто перечитал ваш вопрос ... возможно, я просто слишком быстро прочитал. Вы никоим образом не будете использовать такую ​​функцию, как:

char * foo(const char *filepath)

... с помощью mmap ().

Если вы не можете изменить библиотеку, чтобы вместо нее принимать файловый дескриптор (или как альтернативу пути) .. просто используйте / dev / shm и временный файл, это будет довольно дешево.

0 голосов
/ 01 марта 2009

Вы работаете в Linux, разве вы не можете просто взять источник библиотеки и взломать нужную вам функцию? Если это полезно для других, вы можете даже отправить патч первоначальному автору, так что это будет в будущих версиях для всех.

0 голосов
/ 01 марта 2009

Редактировать: Извините. Просто прочитайте вопрос. С моим советом ниже вы раскошелитесь на запасной процесс, и вопрос «не работает ли в одном процессе, не возникает». Я также не вижу причин, по которым вы не могли бы создать отдельную нить, чтобы сделать push ...


Не совсем элегантно, но вы могли бы:

  1. открыть именованную трубу.
  2. форк стример, который ничего не делает, но пытается записать в канал
  3. передать название трубы

который должен быть довольно крепким ...

0 голосов
/ 01 марта 2009

mmap (), возможно?

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