在不创建新文件的情况下从(C)中的文件中删除字节

时间:2014-07-29 02:57:06

标签: c file

我有一个文件log。我需要从文件启动中删除一些字节,即n个字节。问题是,此文件由其他程序中的其他文件指针引用,并且这些指针可能随时写入此文件log。我无法重新创建新文件,否则文件指针会出现故障(我也不确定)。 我试图谷歌它但所有的建议只是重新写入新文件。 它有什么解决方案吗?

2 个答案:

答案 0 :(得分:2)

我可以提出两个选择:

  • 环形缓冲区
    使用内存映射文件作为日志记录介质,并将其用作环形缓冲区。您将需要手动管理最后写入字节的位置,并在您跨过环的末尾时适当地环绕您的环。这样,您的日志记录文件保持不变大小,但您不能像常规文件那样将其拖尾。相反,当您想要显示日志时,您需要编写一个知道如何遍历环形缓冲区的特殊程序。
  • 多个小日志文件
    使用您登录的一些较小的日志文件,并删除最旧的文件,因为文件集合超出了您想要的日志大小保持。如果最新的日志文件始终命名相同,则可以使用标准tail -F实用程序永久跟踪日志内容。为避免多个程序操作同一文件的问题,您的日志记录代码可以将日志作为消息发送到单个日志记录守护程序。

答案 1 :(得分:0)

所以...你想要改变文件,但你不能。你不能的原因是其他程序正在使用该文件。一般而言,您似乎需要:

  1. 停止所有其他程序在更改文件时弄乱文件 - 将现有的不需要的东西砍掉;

  2. 通知其他程序您已更改它 - 这样他们就可以重新建立文件指针。

  3. 我想必须有一种机制允许其他程序更改文件而不会相互绊倒...所以也许你可以扩展它? [如果所有其他程序都是主程序的子程序,那么如果所有程序都是O_APPEND,那么你可能有机会这样做,也许是借助文件锁或信号量(可能已经存在) ?)。但如果这些程序密切相关,那么@jxh还有其他可能更好的建议。]

    但是,如果您无法以任何方式更改其他程序,那么您似乎被卡住了,除了......

    ...也许你可以尝试稀疏'文件?在(最近的)Linux(至少)上,您fallocate()可以使用FALLOC_FL_PUNCH_HOLE删除您不想要的内容,而不会影响其他程序文件指针。当然,其他程序迟早会溢出文件指针,但这可能是一个理论上而不是实际问题。