mkstemp和硬盘压力

时间:2019-07-11 18:43:17

标签: c unix

使用mkstemp创建的临时文件是否已同步到磁盘?

这是我所拥有的:

  1. 程序使用mkstemp创建临时文件,并将fd发送到另一个程序。

  2. 两个程序都mmap对这个临时文件进行了操作,并且使用率很高(高达400 MB /秒的写入速度和400 MB /秒的读取速度;每秒最多60次读取和写入)。

  3. 我不能使用memfd_create(目标设备可能不支持)。

  4. 我们还假设(这几乎是对的)我无法在tmpfs上创建此文件(例如在/ tmp中)。

我需要确保此类文件不会对硬盘造成压力。我不允许将其写入磁盘,即使这仅每5秒发生一次。如果我不能获得这样的保证,我会寻找另一种方式。

其他信息(不重要):

我正在为Android设备编写Wayland合成器。当前,临时文件(实际上是wayland表面)是在tmpfs上创建的。只要未启用SELinux,一切都可以正常工作。但是,如果启用SELinux,它将阻止fd从客户端转移到合成器。我目前知道的唯一解决方案是在应用程序的主目录中创建临时文件。但是,如果这种方法很危险,我会找到另一种方法。

1 个答案:

答案 0 :(得分:1)

  

使用mkstemp创建的临时文件是否已同步到磁盘?

mkstemp函数不会对它打开的文件赋予任何特殊的属性,这会阻止文件同步到磁盘。创建它们的文件系统可能具有这样的属性,但这与文件创建无关。特别是,如果未删除,则通过mkstemp()创建的文件将无限期保存。

  

我需要确保此类文件不会对硬盘造成压力。我不允许将其写入磁盘,即使这仅每5秒发生一次。如果我不能获得这样的保证,我会寻找另一种方式。

据我所知,即使tmpfs文件系统也不能保证其内容将保持锁定在内存中,而不是被调出页面。它们由虚拟内存支持。但是,如果实际文件相对较小且所有页面都很热,则它们很可能仅保留在内存中。

关于更大的问题,

  

只要未启用SELinux,一切正常。但是如果我   启用S​​ELinux,可以防止将fd从客户端转移到   合成器。我目前知道的唯一解决方案是创建临时   应用程序主目录中的文件。

默认情况下,新创建的文件继承其父目录的SELinux类型。您的Wayland客户端大概没有足够的权限来修改其创建的文件的SELinux标签,但是您应该能够在任何需要的地方通过管理方式创建目录,并使用符合您需求的标签。例如,您可以导致为此目的创建/dev/shm的子目录(每次引导),并为chcon设置一个适当的标签。如果客户端在此处创建其临时文件,则它们应该继承您选择的SELinux类型。