代码之家  ›  专栏  ›  技术社区  ›  DarenW

将数据馈送到C API(需要文件名)

  •  3
  • DarenW  · 技术社区  · 17 年前

    我正在Linux上编写一个简单的C程序,并希望使用现有库的API,该API需要来自文件的数据。我必须将文件名作为常量字符*提供给它。但我有数据,就像文件的内容一样,已经存在于堆上分配的缓冲区中。内存充足,我们需要高性能。为了避免将临时文件写入磁盘,以类似文件的方式将数据提供给此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( ??? );
    }
    

    我想到了管道和mkfifo(),但似乎是为了在进程之间进行通信。我不是这些方面的专家。命名管道可以在同一个过程中读写吗?这是明智的做法吗?

    或者跳过聪明的做法,采用“B”计划,即脱掉衣服,只写一个临时文件。然而,除了获得高性能外,我还想学习一些新的东西,并找出在这种情况下可能出现的情况。

    5 回复  |  直到 17 年前
        1
  •  3
  •   TofuBeer    17 年前

    考虑到您可能具有以下功能:

    char *read_data(const char *fileName)
    

    我认为你需要“跳过聪明,按照计划“B”去做,那就是脱掉衣服,只写一个临时文件。”

    有一个想法确实浮现在脑海中,你能把你的代码写成一个内存映射文件而不是堆吗?这样,您就可以在磁盘上已有一个文件,并且可以避免复制(尽管它仍然在磁盘上),并且您仍然可以为函数调用提供文件名。

        2
  •  2
  •   Tim Post Samir J M Araujo    17 年前

    我不确定库函数需要什么样的输入。。。它需要路径/文件名、打开文件指针或打开文件描述符吗?

    如果不想破解库,而函数需要字符串(文件路径),请尝试在/dev/shm中创建临时文件。

    否则,mmap可能是最好的选择,请确保在使用mmap()时研究posix_madvise()(或者在使用临时文件时研究其对应的posix_fadvise()。

    看起来您刚开始谈论的数据很少,所以我认为无论您采取何种方式,都不会对性能产生影响。

    编辑

    char * foo(const char *filepath)
    

    ... 使用mmap()。

    如果无法修改库以接受文件描述符(或作为路径的替代项)。。只要使用/dev/shm和一个临时文件,它就相当便宜了。

        3
  •  0
  •   Ana Betts    17 年前

    您现在使用的是Linux,难道您就不能获取库的源代码并破解所需的函数吗?如果它对其他人有用,您甚至可以向原始作者发送一个补丁,因此它将在将来的版本中为每个人提供。

        4
  •  0
  •   dmckee --- ex-moderator kitten    17 年前

    编辑: 很抱歉读一下问题。根据我下面的建议,您可以创建一个备用流程,而“在单个流程中不工作”的问题不会出现。我也认为没有理由你不能产生一个单独的线程来做推。。。


    一点也不优雅,但你可以:

    1. 打开命名管道。
    2. 传递管道的名称

    这应该是相当稳健的。。。

        5
  •  -1
  •   smcameron    17 年前

    也许是?