在linux中创建非持久性文件的最佳方法是什么?

时间:2017-02-01 13:53:39

标签: c linux file-handling temp

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

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

那么最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

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)

所以在这个系统上,我可以在/dev/shm/ /run上打开和写入文件,它们将由我的内存支持,它们不会在引导后持久存在,并且访问速度很快便宜。

回到您的问题,您似乎可以更改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

编辑 - 更多的事情:

  • 这是依赖于分布的;其他发行版可能会在tmpfs上安装/tmp
  • 有趣的是,/ dev / shm是存储用shm_open创建的共享内存对象的地方。

答案 1 :(得分:2)

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

epoch中的启动时间:

stat -c %Y /proc/1

epoch中的文件创建时间:

stat -c %Y filename.tmp

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

答案 2 :(得分:0)

使用例如创建文件return $.parseHTML('<i class="fa ' + $(originalOption).data('icon') + '"></i> ' + icon.text);,然后立即删除文件(open)。由于你打开它,你仍然可以使用该文件,但是一旦它关闭(显式地使用unlink或因为操作系统在进程退出时崩溃(崩溃或不崩溃))那么它就像它从未存在过。