c - 将数据提供给需要文件名的 C API

标签 c api posix named-pipes mkfifo

我正在 Linux 上编写一个简单的 C 程序,并希望使用现有库的 API,该 API 需要来自文件的数据。我必须给它提供一个 const char* 形式的文件名。但我有数据,就像文件的内容一样,已经位于堆上分配的缓冲区中。有足够的 RAM,我们想要高性能。想要避免将临时文件写入磁盘,以类似于文件的方式将数据提供给此 API 的好方法是什么?

这是我的代码的一个廉价假装版本:

marvelouslibrary.h:

int marvelousfunction(const char *filename);

normal-persons-usage.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 函数;它只能读取一个文件。

我想到了管道和 mkfifo(),但似乎意味着用于进程之间的通信。我不是这些事情的专家。命名管道可以在同一进程中读取和写入吗?这是一个明智的做法吗?

或者跳过聪明,采用计划“B”,即停止并只编写一个临时文件。但是,除了获得高性能之外,我还想学习新的东西,并找出在这种情况下可能发生的事情。

最佳答案

鉴于您可能有这样的功能:

char *read_data(const char *fileName)

我认为你需要“跳过聪明,采用计划“B”,即停止并只编写一个临时文件。”

如果您可以深入研究并找出您正在进行的调用是否正在调用另一个采用 File * 或 int 作为文件描述符的函数,那么您可以做得更好。

确实想到了一个想法,您可以更改代码以写入内存映射文件而不是堆吗?这样,您就已经在磁盘上有了一个文件,并且可以避免复制(尽管它仍然在磁盘上),并且您仍然可以为函数调用提供文件名。

关于c - 将数据提供给需要文件名的 C API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/599358/

相关文章:

c - 有 memcpy 问题

c - 无法传输二进制文件

api - 为什么 lseek 返回 0?

linux - 在 Linux 上持久化需要什么?

c - C中的链表实现

c++ - 标记(在标记和扫描中)函数如何追踪出可从根部访问的对象集?

java - Magento XML-RPC API - 从 Java 创建货件

android - 使用多个查询参数改造 POST

没有 fork 可以用 pipe 吗?

c - 使用 `posix_fallocate` 创建的修剪文件