2016-07-10 25 views
0

假设您有某个应用程序正在写入的数据文件。一旦数据被读取,它就没有用,所以它可以被删除以节省空间。在这里我的设计处理这个:从系统级别的文件中擦除已读取的数据

1)一旦文件达到一定的大小,获取它的锁 2)看看索引(代表当前文件中的字节指针)读取在vnode表中调用此文件 3)删除索引前的所有文件数据 4)将读取调用的索引更新到文件的新开头 5)解锁文件以便可以恢复读/写我认为如果这是在系统级完成的,那么它是独立于语言的(即如果应用程序正在使用java调用或python调用来读/写,则存在没有问题)。

数据文件位于unix v6文件系统上。监视一个文件的大小和删除数据是没有问题的,但我找不到一个系统调用来1)访问vnode表中的其他条目来查看它们在读取文件的位置; 2)更新读取指针这些系统调用。

回答

0

Unix v6文件系统没有任何意义。我相信你不是指1975年贝尔实验室为PDP-11发布的v6 Unix系统;首先,我确定它从不支持Java或Python!所以你可能需要更具体一些你的意思。它不能是OpenBSD(它还没有发布版本6),或者FreeBSD(到版本10和版本6将会过时)。也许NetBSD?

在任何情况下,我都不会建议尝试对内核进行更改以支持此操作,因为它非常不便携,并且比您认为正确操作要困难得多。特别是,重新编号逻辑块到物理块之间的映射是棘手的。有支持PUNCH HOLE操作的操作系统和文件系统(例如Linux的ext4和xfs),只要这些偏移量是文件系统块大小的倍数,就会在指定的起始偏移和结束偏移之间取消分配块。你甚至可以使用COLLAPSE RANGE操作,它会从文件的开始或中间“删除”字节---但是它们必须是文件系统块大小的倍数,并且它们不会影响文件偏移量任何打开的文件描述符。 COLLAPSE RANGE通常是一个非常糟糕的主意,因为它需要删除文件的所有缓存页面以保持页面缓存的一致性。它有用的时代非常罕见。主要的用例似乎是操纵真正大型视频文件的人。但在架构上,这几乎可以肯定地是而不是你想要做什么。

我会推荐的是在用户空间中这样做。是的,这意味着您需要在Java和Python中实现支持,但相信我,这比尝试执行内核和文件系统级别的黑客攻击更容易。如果你真的坚持,你可以创建一个C库,然后创建可以从Java和Python调用的SWIG接口,但实际上可能更容易在惯用和原生Java和Python代码中重新实现逻辑两次。

我会做的是让作者写入块大小约为1兆字节的块,一旦块达到一定大小,在新文件中开始一个新块。以数字命名块 - 即,data0001,data0002等。读者可以简单地读取块,并且当它完成时,删除块文件,并继续前进。

真的很简单,它不会让你迷失在试图进行内核级黑客攻击的杂草中。

+0

良好的捕获 - 我的意思是一个类似unix的文件系统,就像你会在Linux服务器上找到的那样(我正在阅读有关unix v6的知识来学习基本概念)。 – pqx994

+0

看起来你的建议不起作用,因为我不是作家 - 想象一下当前正在运行的不是我的应用程序正在写入文件。我无法编辑应用程序以及它如何写入,我只知道文件名并有权访问它。 – pqx994

+0

@ pqx994你可以让应用程序写入FIFO吗? –