Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将RAM数据视为真实文件?_C++_C_Windows_Share_Ram - Fatal编程技术网

C++ 如何将RAM数据视为真实文件?

C++ 如何将RAM数据视为真实文件?,c++,c,windows,share,ram,C++,C,Windows,Share,Ram,所以我的程序中有一些临时数据(在RAM中)。我想以某种方式使它看起来像一个文件(例如,将它发送到另一个以文件链接为参数的程序中) 可能吗 怎么做这样的事?你可以用pipe()来做 函数应创建一个管道并放置两个文件描述符, 参数fildes[0]和fildes[1]中各有一个,它们引用 打开管道读写端的文件描述。他们的 整数值应为试验时可用的两个最低值 管道()调用。O_NONBLOCK和FD_CLOEXEC标志应在两个屏幕上清晰可见 文件描述符。(fcntl()函数可用于设置这两个参数 旗帜。)

所以我的程序中有一些临时数据(在RAM中)。我想以某种方式使它看起来像一个文件(例如,将它发送到另一个以文件链接为参数的程序中)

可能吗

怎么做这样的事?

你可以用pipe()来做

函数应创建一个管道并放置两个文件描述符, 参数fildes[0]和fildes[1]中各有一个,它们引用 打开管道读写端的文件描述。他们的 整数值应为试验时可用的两个最低值 管道()调用。O_NONBLOCK和FD_CLOEXEC标志应在两个屏幕上清晰可见 文件描述符。(fcntl()函数可用于设置这两个参数 旗帜。)
您可以使用
popen()
函数在C中执行此操作:

FILE *f = popen("program args", "w");
// write your output to f here using stdio
pclose(f);

如果您的外部程序从
stdin
读取其输入,则这是可能的。是的,这是可能的。您可以通过以下机制将数据传输到其他应用程序:

  • 根据您的操作系统,这里有不同的选项。正如其他海报在这里提到的,您可以创建一个管道,因为许多操作系统都有管道
  • 您还可以使用共享内存
  • 您可以简单地将其写入一个文件,然后在其他应用程序中打开该文件
  • 许多操作系统都有其他可以使用的技术


  • 编辑:MSDN列出了适用于Windows的所有IPC机制。

    如果您的操作系统(Unixoid系统和Windows都支持),您可以尝试使用。

    为什么不直接将文件写入磁盘?如果写入磁盘速度太慢,可以传递
    文件属性\u临时
    标志以将数据保留在缓存中(并避免将其写入物理设备)



    有时候,显而易见的解决方案是最好的…

    您正在运行什么操作系统?只将数据写入“真实”文件并将该文件作为参数发送有什么不对?@codeka:我不知道。。。可能是因为HDD访问是uhm。。。慢?@LiraNuna:看我的答案,写入磁盘并不一定要慢,尤其是临时文件。@Billy ONeal:没错,但是任何通用C实现都提供了这样一个
    popen()
    函数(尽管它可能被称为
    \u popen()
    ,就像在MSVC中一样)。这还假设OP希望从保存数据的程序内部执行/启动外部程序。尽管如此,这个解决方案还是很灵巧的,除非你使用的是Windows<代码>\u popen除非使用控制台子系统而不是Windows子系统启动给定的应用程序,否则无法正常工作。此外,无法将管道名称传递给另一个需要文件名的Windows应用程序。这是正确的方法+5如果可能的话。+1但我想这是一个缓存和文件有多大的问题,希望第一个比第二个大@mdma:是的,但是如果缓存太小,无法容纳文件,那么您可能会认为首先将整个文件保存在内存中可能不好。
    FILE\u ATTRIBUTE\u TEMPORARY
    的好处是,如果缓存中没有足够的空间,它仍然会使用文件系统,因此您不必担心。为什么不呢:因为您将数据从RAM复制到系统RAM,使用的内存量是原来的两倍。内存映射文件不存在。哪些进程正在相互通信?答案没有道理。@samoz-OP描述了两个程序——一个程序在RAM中有他想要发送的数据,另一个程序需要接收该数据。Program==在操作系统中运行时的进程。不是Windows函数(请参见问题注释)是的,我意识到,但在编辑问题之前,没有指定操作系统。虽然我同意这不是Windows的方式,但仍然可以在Windows上使用POSIX函数,如pipe(例如使用Cygwin)但我同意这不是我为windows+1给出的答案。这样,除非操作系统决定必须复制数据,否则不会复制数据。
    FILE *f = popen("program args", "w");
    // write your output to f here using stdio
    pclose(f);