【问题标题】:Redirect file descriptor into memory将文件描述符重定向到内存
【发布时间】:2015-08-18 13:41:13
【问题描述】:

我正在使用一个文件 API,它在写入文件时只提供一个 const char* filename 接口(接受 -stdout)。相反,我希望将输出写入内存,这样我就可以将数据传递到其他地方。

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

但是,我需要访问的数据在生成的数据中确实具有固定的长度和偏移量(例如,在 1MB 之外,我需要从 384KB 开始的 64KB 等)。因此,有没有办法用fmemopen/open_memstream 设置一个循环缓冲区,它会一直被重写,直到达到有问题的偏移量? (我意识到这是低效的,但没有能力寻求。)

或者这是错误的方法?我已经阅读了一些关于内存映射文件的内容,这似乎与我想要实现的目标相似,但这并不是我所了解的......


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

【问题讨论】:

  • 便携性怎么样?想到使用/dev/fd/? 并在不同的线程/进程中读取。
  • 谢谢,@Diego:这种方法很有效,而且很容易实现。如果您将其发布为答案,我会接受它(同时提供没有更好的建议!)

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


【解决方案1】:

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

如果管道容量不够,则需要两个线程才能使这种方法起作用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2011-07-03
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多