【问题标题】:Insert text using Unix syscalls使用 Unix 系统调用插入文本
【发布时间】:2014-05-16 18:06:23
【问题描述】:

Unix write 系统调用替换(覆盖)字符。有没有办法插入 字符转换为 Unix 文件。我们希望在不复制文件的情况下实现这一点。

这种情况下 mmap 能来救援吗?

例如修改前文件A的内容:

abcdef
1234567

修改后文件A的内容:

abcdef
:/"}{>
1234567

【问题讨论】:

  • 您可以通过打开追加“插入”在末尾。或者在中间使用 lseek 到该区域并重写该点之后的所有数据(不要忘记在覆盖之前使用 read 将其保存到缓冲区)

标签: c unix file-io


【解决方案1】:

不,“插入”数据的想法是文本编辑器的假象。

如果你有一个文本文件并且你想将数据“插入”到文件中,你必须读取数据,修改它,然后把它写回一个新文件。

【讨论】:

    【解决方案2】:

    简短的回答是“否” - 手册第 2 节中的系统调用不支持这一点。在平面 unix 文件上,您必须在插入数据后重新写入文件中的所有内容。 mmap 无法解决这个问题,除非您通过写入 mmap()ed 内存缓冲区并让 O/S 处理 I/O 来做到这一点。

    如果您需要有效地执行此操作,则需要某种块结构。链表是这种结构的一个简单示例。如果您需要随机访问,则必须在其上覆盖树结构。这大致就是 ISAM 类型文件结构的工作原理。

    在 O/S 中伪造此功能需要您在文件系统元数据中实现类似的功能。这会将您的问题升级为自定义文件系统并使用内核进行处理,这将耗费大量精力并且会使您的系统与其他系统不兼容。

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 2011-06-13
      • 1970-01-01
      • 2023-04-09
      • 2012-07-16
      • 1970-01-01
      • 2010-11-03
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多