【问题标题】:What is the best way to create a non-persistent file in linux [closed]在linux中创建非持久文件的最佳方法是什么[关闭]
【发布时间】:2017-02-01 13:53:38
【问题描述】:

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

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

那么最好的方法是什么?

【问题讨论】:

  • 文件中是否有任何信息或数据存储?
  • @AndrewHenle 不,文件中没有任何信息,它只是用来确定它是在启动后第一次生成的进程还是在崩溃后重新生成的进程
  • (创建并)附加一个共享内存段。这些在进程终止(或崩溃)后仍然存在,但不会在重新启动后继续存在。

标签: c linux file-handling temp


【解决方案1】:

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

编辑 - 更多内容:

  • 这完全取决于分布;其他发行版可能会将tmpfs 挂载到/tmp
  • 有趣的是,/dev/shm 是使用shm_open 创建的共享内存对象的存储位置。

【讨论】:

  • 实际上正在开发的应用程序是一个具有powerpc架构的嵌入式应用程序。每次系统重新启动时都必须运行一些脚本来删除/tmp目录中的文件,该脚本没有运行,从而导致文件在 /tmp 目录中是持久的。无论如何感谢@Ezequiel Garcia 的建议。它解决了:)
  • 嗯,我想这取决于你想要/tmp 是什么。您想要一个磁盘支持的临时存储,并且您想在重新启动时将其删除?然后就好了。在我的嵌入式平台上,我将 tmpfs 挂载在 /tmp 上,因此我不使用磁盘(并且不需要在重新启动时删除任何内容)。
【解决方案2】:

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

epoch 中的启动时间:

stat -c %Y /proc/1

文件创建时间:

stat -c %Y filename.tmp

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

【讨论】:

  • 但是进程的崩溃是不可预测的,所以不能依赖时间戳的概念来确定进程是第一次产生还是在崩溃后产生。
  • 为什么不呢?如果启动时间和创建时间的差大于ej 2*booting time,就知道是respawn
【解决方案3】:

使用例如创建文件open,然后立即删除文件(使用unlink)。既然你打开了文件,你仍然可以使用它,但是一旦它关闭(明确地使用close 或因为操作系统在进程退出时关闭它(崩溃与否)),它就会像它永远不会存在。

【讨论】:

  • 我认为这个想法是另一个进程将检查文件的存在以确定该进程是否已经产生。通过删除文件,您可以阻止此方案的工作...
  • 这个想法是,文件的存在只会帮助我确定是否需要调用启动时函数(针对所问问题的函数 X w.r.t)或运行时函数。所以我不会向文件中写入任何内容,我只会使用它的存在来决定需要调用哪个函数。
猜你喜欢
  • 1970-01-01
  • 2014-01-22
  • 2011-08-15
  • 1970-01-01
  • 2021-01-21
  • 2012-01-19
  • 2018-06-07
  • 2012-01-28
  • 2014-03-28
相关资源
最近更新 更多