使用mkstemp
创建的临时文件是否已同步到磁盘?
这是我所拥有的:
程序使用mkstemp
创建临时文件,并将fd发送到另一个程序。
两个程序都mmap
对这个临时文件进行了操作,并且使用率很高(高达400 MB /秒的写入速度和400 MB /秒的读取速度;每秒最多60次读取和写入)。
我不能使用memfd_create(目标设备可能不支持)。
我们还假设(这几乎是对的)我无法在tmpfs上创建此文件(例如在/ tmp中)。
我需要确保此类文件不会对硬盘造成压力。我不允许将其写入磁盘,即使这仅每5秒发生一次。如果我不能获得这样的保证,我会寻找另一种方式。
其他信息(不重要):
我正在为Android设备编写Wayland合成器。当前,临时文件(实际上是wayland表面)是在tmpfs上创建的。只要未启用SELinux,一切都可以正常工作。但是,如果启用SELinux,它将阻止fd从客户端转移到合成器。我目前知道的唯一解决方案是在应用程序的主目录中创建临时文件。但是,如果这种方法很危险,我会找到另一种方法。
答案 0 :(得分:1)
使用
mkstemp
创建的临时文件是否已同步到磁盘?
mkstemp
函数不会对它打开的文件赋予任何特殊的属性,这会阻止文件同步到磁盘。创建它们的文件系统可能具有这样的属性,但这与文件创建无关。特别是,如果未删除,则通过mkstemp()
创建的文件将无限期保存。
我需要确保此类文件不会对硬盘造成压力。我不允许将其写入磁盘,即使这仅每5秒发生一次。如果我不能获得这样的保证,我会寻找另一种方式。
据我所知,即使tmpfs文件系统也不能保证其内容将保持锁定在内存中,而不是被调出页面。它们由虚拟内存支持。但是,如果实际文件相对较小且所有页面都很热,则它们很可能仅保留在内存中。
关于更大的问题,
只要未启用SELinux,一切正常。但是如果我 启用SELinux,可以防止将fd从客户端转移到 合成器。我目前知道的唯一解决方案是创建临时 应用程序主目录中的文件。
默认情况下,新创建的文件继承其父目录的SELinux类型。您的Wayland客户端大概没有足够的权限来修改其创建的文件的SELinux标签,但是您应该能够在任何需要的地方通过管理方式创建目录,并使用符合您需求的标签。例如,您可以导致为此目的创建/dev/shm
的子目录(每次引导),并为chcon
设置一个适当的标签。如果客户端在此处创建其临时文件,则它们应该继承您选择的SELinux类型。