将文件描述符重定向到内存

时间:2015-08-18 13:41:13

标签: c posix memory-mapped-files circular-buffer

我正在使用的文件API在编写文件时只提供const char* filename接口(-接受stdout)。我宁愿把输出写入内存,所以我可以将数据传递到别处。

我可以使用dup2stdout重定向到任意文件描述符,例如fmemopen / open_memstream作为我的接收器。但是,内存流功能需要一个大小,在我的情况下 - 我事先并不知道,可能是任意大的。

然而,我需要访问的数据确实具有固定长度和偏移量(例如,1MB以内,我需要从384KB开始的64KB等)。因此,有没有办法设置一个带有fmemopen / open_memstream的循环缓冲区,只是在到达相关偏移量之前不断重写? (我意识到这是低效的,但是没有能力去寻找。)

或者这是错误的做法?我已经阅读了一些关于内存映射文件的内容,这似乎与我想要实现的类似,但它并不是我所知道的......

编辑为了清楚起见,我无法向磁盘写任何内容。

1 个答案:

答案 0 :(得分:1)

使用dup2重定向stdout到管道并使用-调用API以指示它使用标准输出。然后从管道中读取API生成的数据,对其进行过滤并将其存储在内存区域中。

如果管道容量不够,则需要两个线程才能使此方法有效。

将运行API调用生成数据并将其放入管道。

另一个线程将从管道获取数据,检查偏移量并在达到目标偏移量时将数据存储在内存中。但是继续读取管道直到EOF,以便其他线程可以完成API调用并优雅地完成。