Win32的 CreateFileFILE_FLAG_DELETE_ON_CLOSE, 但是我在Linux。

我想要打开一个临时文件,该文件将总是会被删除吁程序的终止。我可以理解的是,在这种情况下的程序的崩溃,它可能不是切实保障这一点,但在任何其他情况下我喜欢它的工作。

我知道RAII.我知道的信号。我知道关于 atexit(3).我知道我可以打开文件,并将它删除,并立即该文件将仍然访问,直到该文件描述被关闭(即使处理的崩溃).没有这些似乎是一个完全和直接的解决方案:

  1. RAII:在那里,这样做:我有一个对象,其析构删除的文件,但析构不叫如果程序的终止通过一个信号。
  2. 信号:我正在写一个低级别的图书馆,这使得注册信号处理程序的一个棘手的提议。例如,如果应用程序使用的信号吗?我不想要步骤上的任何脚趾。我可能会考虑一些聪明的使用 sigaction(2) 应付...但还没有把足够的思想到这种可能性。
  3. atexit(3):显然是无用的,因为它不是在异常的终止(例如通过一个信号)。
  4. 抢先 unlink(2):这是非常好除了我需要的文件,以保持可见于文件系统(否则,该系统很难监视/排除故障).

你做什么会在这里?

进一步的解释

我省略一个细节在我原来的职位,而现在我意识到我应该包括在内。"文件"在这种情况下不是严格意义上的正常的文件,而是一个POSIX消息队列。我创建它通过 mq_open().它可以关闭,通过 mq_close()close() (前者的别名为后者在我的系统)。可以从系统中除去通过 mq_unlink().所有这一切都使得它类似于普通文件, 除了 我不能选择目录的文件的驻留。这使得当前最受欢迎的答复(将在文件 /tmp)不可行的,因为"文件"是由系统创建一个虚拟的文件系统与非常有限的能力。(我已经安装的虚拟文件系统中 /dev/mqueue, 下述例子中的 man mq_overview) .

这也解释了为什么我需要的名称,以保持可见(使得立即取消关联的办法不可行):"文件"必须共享之间的两个或多个进程。

有帮助吗?

解决方案

要求的名称仍然可见的同时,该进程是行使这个难以实现。你能重新考虑这一要求?

如果没有,则有可能不是一个完美的解决方案。我会考虑相结合的一个信号处理策略什么卡米尔*robert之建议。你可以跟踪信号处理程序安装的前安装的信号处理程序。如果处理程序默认的是SIG_IGN,你不会的通常安装自己的处理程序;如果这是SIG_DFL,你将记住这一点;如果是别的东西-一个用户定义的信号处理器-你会记得,指针,并安装自己。当你处理程序被称为,你会做任何你需要做的,然后叫记住的是处理程序,因此链接的处理程序。你还将安装一个atexit()处理程序。你会还的文件,你这样做,并将信号为你做它。

注意信号处理的是一个不完美的战略;SIGKILL不能被抓住,并atexit()处理程序不会叫,并对该文件将剩下的周围。

大卫Segond的建议-临时文件名守护程序是有趣的。为简单的进程,这是充分的;如果在处理请求临时文件叉和预计的儿童以自己的文件之后(退出)然后守护程序有一个问题时检测后处理使用死了-因为这不会自动知道的过程,它打开。

其他提示

如果你只是一个临时文件,就创建它 /tmp 或子目录物。然后做一个最好的办法了要删除它的时候做过 atexit(3) 或类似的。只要你使用独特的名字摘过 mkstemp(3) 或类似的甚至如果失败可以删除,因为程序的崩溃,你没有风险读它再次在后续行或其他这类条件。

在这一点上,它只是一个系统级别的问题保持 /tmp 清洁。大多数发布擦它在启动或关闭,或运行定期定时任务,以删除旧的文件。

也许有人建议这已经是的,但我无法发现它,给你所有的要求,最好的我能想到的是有文件以某种方式传达给父母一进程,诸如开始脚本,这将清理过程之后死亡,如果它未能这样做。这也许是主要是被称为看门狗,但是然后用更多的共同使用的情况下加入到杀害和/或重新启动该进程时,它在某种程度上失败。

如果你父母过程中死亡作好了,你几乎走运,但大多数脚本环境是相当强大和少死除非脚本是打破,这往往更容易保持正确的比程序。

在过去的,我已建立一个"临时文件管理者",跟踪临时文件。

人们会请求一个临时文件名称从管理和这个名字登记。

一旦你不需要的临时文件名称的更多,你通知管理和文件名是未登记。

在收到终止的信号,所有注册的临时文件被毁。

临时文件名是usb驱的基础,以避免冲突。

你可以的过程叉后创建该文件,然后等待的儿童以关闭,然后父母可以取消的文件和出口。

我刚刚加入计算器,并发现你在这里:)

如果你要问题是管理mq文件并保留他们自堆积起来,你真的不需要保证删除文件后终止。如果你只是想无用的文件堆积如山,比记日记可能是所有你需要的。添加一个条目的杂志文件后mq被打开,另一个入口,当它被关闭,并且当库是初始化,检查不一致性在《日刊》,并采取任何行动需要纠正的不一致。如果你担心撞击时 mq_open/mq_close 被所谓的,你还可以添加一个日志条目前这些职能。

  • 有一本书-保持目录的临时文件在您点的目录。
  • 在创建一个临时文件,首先创建书保存入文件的书保存目录,包含路径或usb驱你要的临时文件。
  • 创建该临时文件。
  • 当临时文件被删除,然后删除该书记文件。
  • 程序启动时,扫描的簿记录的任何文件包含的路径临时文件,并试图将其删除,如果发现,他们删除书记文件。
  • (日志大肆如果任何步骤失败了。)

我看不到的方式来做到这一点的任何方式更加简单。这样板任何生产优质的程序必须通过;+500线的很容易。

做你 真的 需要一名称仍然可见?

假设你把选项的立即取消关联的文件。然后:

  • 抢断开链接(2):这是非常好除了我需要的文件,以保持可见于文件系统(否则,该系统很难监视/排除故障).

    你仍然可以试上一个被删除的文件,因为它将仍然可见下 /proc/$pid/fd/.只要你知道pid的进程,列举了他们的公开的文件应该是容易的。

  • 该名需要保持可见的正常运行期间,因为他们之间共享程序。

    你仍然可以分享删除开文件进程之间的通过围绕该文件描述了Unix domain sockets.看看 便携式方式传递的文件描述不同的进程之间 更多的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top