C语言 在 Linux 中创建非持久性文件的最佳方法是什么



在我的应用程序中,我创建了一个 C 进程,如果该进程死亡,该进程将重新生成。现在我有一个要求知道进程是否是第一次生成(系统重新启动后),由于将调用哪个函数 X,或者进程是否在崩溃(运行时)后重新生成由于哪个函数 Y 将被调用。

我尝试使用命令 mktemp() 创建临时文件,但即使在重新启动后,这些文件似乎仍然存在。

那么最好的方法是什么呢?

mktemp /tmp创建文件(默认情况下)。在许多发行版中,/tmp是持久的(即磁盘支持的,而不是内存支持的)。

您要查找的是使用内存支持的装载中创建文件。通常,这些是tmpfs坐骑。例如,在我的 Arch Linux 笔记本电脑上,我的 tmpfs 挂载是:

$ mount | grep tmpfs
[..]
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime)

因此,在这个系统上,我可以在/run上打开和写入/dev/shm/文件,它们将由我的记忆支持,它们不会在启动后持续存在,并且访问将快速且便宜。

回到你的问题,似乎你可以改变mktemp使用的目录。引用手册页:

-p DIR, --tmpdir[=DIR]
              interpret  TEMPLATE relative to DIR; if DIR is not specified, use $TMPDIR if set, else /tmp.  With this option, TEMPLATE must not be
              an absolute name; unlike with -t, TEMPLATE may contain slashes, but mktemp creates only the final component

编辑 - 还有几件事:

  • 这完全依赖于发行版;其他发行版可能会在/tmp挂载tmpfs
  • 有趣的是,/dev/shm 是存储使用 shm_open 创建的共享内存对象的地方。

我没有看到持久性/tmp 的问题。您可以检查时间戳并将其与启动时间进行比较。

以纪元为单位的启动时间:

stat -c %Y /proc/1

以纪元为单位的文件创建时间:

stat -c %Y filename.tmp

这种方法的最大优点是可移植性,因为它不依赖于特定于发行版的 tmpfs 设置

创建文件 open,然后立即删除该文件(带 unlink )。由于您打开了该文件,因此您仍然可以使用该文件,但是一旦它关闭(明确使用 close 或因为操作系统在进程退出时关闭它(崩溃与否)),那么它将就像它从未存在过一样。

最新更新