在 linux 中创建非持久文件的最佳方法是什么
What is the best way to create a non-persistent file in linux
在我的应用程序中,我创建了一个 C 进程,如果进程终止,它将重新生成。现在我需要知道进程是否是第一次生成(在系统重启后),由于将调用哪个函数 X,或者进程是否由于哪个函数 Y 在崩溃(运行时)后重新生成将被调用。
我尝试使用命令 mktemp() 创建临时文件,但这些文件似乎在重新启动后仍然存在。
那么最好的方法是什么?
使用例如创建文件open
,然后立即删除文件(使用 unlink
)。因为你打开了文件,你仍然可以使用它,但是一旦它关闭(明确地使用 close
或者因为 OS 在进程退出时关闭它(崩溃与否))然后就像它从未存在过一样。
mktemp
在 /tmp
中创建文件(默认)。在许多发行版中,/tmp
是持久的(即 disk-backed,而不是 memory-backed)。
您正在寻找的是在 memory-backed 安装中创建一个文件。通常这些是 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
编辑 - 更多内容:
- 这就是全部distribution-dependent;其他发行版可能会在
/tmp
. 挂载 tmpfs
- 有趣的是,/dev/shm 是存储使用
shm_open
创建的共享内存对象的地方。
我没有看到持久性 /tmp 的问题。您可以检查时间戳并将它们与启动时间进行比较。
纪元启动时间:
stat -c %Y /proc/1
文件创建时间(纪元):
stat -c %Y filename.tmp
这种方法的最大优点是可移植性,因为它不依赖于 distro-specific tmpfs 设置
在我的应用程序中,我创建了一个 C 进程,如果进程终止,它将重新生成。现在我需要知道进程是否是第一次生成(在系统重启后),由于将调用哪个函数 X,或者进程是否由于哪个函数 Y 在崩溃(运行时)后重新生成将被调用。
我尝试使用命令 mktemp() 创建临时文件,但这些文件似乎在重新启动后仍然存在。
那么最好的方法是什么?
使用例如创建文件open
,然后立即删除文件(使用 unlink
)。因为你打开了文件,你仍然可以使用它,但是一旦它关闭(明确地使用 close
或者因为 OS 在进程退出时关闭它(崩溃与否))然后就像它从未存在过一样。
mktemp
在 /tmp
中创建文件(默认)。在许多发行版中,/tmp
是持久的(即 disk-backed,而不是 memory-backed)。
您正在寻找的是在 memory-backed 安装中创建一个文件。通常这些是 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
编辑 - 更多内容:
- 这就是全部distribution-dependent;其他发行版可能会在
/tmp
. 挂载 - 有趣的是,/dev/shm 是存储使用
shm_open
创建的共享内存对象的地方。
tmpfs
我没有看到持久性 /tmp 的问题。您可以检查时间戳并将它们与启动时间进行比较。
纪元启动时间:
stat -c %Y /proc/1
文件创建时间(纪元):
stat -c %Y filename.tmp
这种方法的最大优点是可移植性,因为它不依赖于 distro-specific tmpfs 设置