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