我想在linux上创建一个临时文件,同时确保文件在我的程序终止后消失,即使它被杀死或有人在错误的时刻执行了硬重启。 tmpfile()
是否会为我处理这一切?
答案 0 :(得分:4)
你似乎已经预先知道文件可能因某些竞争条件而遗留下来,我没有看到解释为什么这是一个问题。
“当程序由于意外排序导致在同一资源上产生争用的事件而无法正常工作时,就会出现竞争条件。”
我假设您对其他答案的评论是关于死锁的问题,这是因为尝试修复竞争条件(争用共享资源)。目前还不清楚你关注的是什么,调用tmpfile()
并让程序在该函数调用unlink()
之前异常退出是你最不担心的,如果你的应用程序真的那么脆弱。
鉴于没有提及将此文件描述符共享到该临时文件的并发,线程或其他进程,我仍然没有看到竞争条件的可能性,也许是概念不完整的逻辑事务,但可以检测和清理。
确保清除所有已分配的文件系统资源的正确方法是不仅针对应用程序的退出,而且还 start-向上即可。我的所有服务器代码都确保在之前的 之前清除所有内容并使其自身可用。
将您的临时文件放在/tmp
的子目录中,确保您的应用程序在启动和正常关闭时清除此子目录。您可以使用shell脚本启动应用程序,该脚本根据kill -9
存在检测异常(PID
)关闭,并执行清理活动。
答案 1 :(得分:3)
如果您不想使用tmpfile()
,则可以在创建文件后立即unlink()
您的文件。它将保持开放状态并在分配之前分配。
但是在硬重启时,可能需要fsck来恢复空间。但由于情况总是如此,这种方法并没有特别的缺点。
答案 2 :(得分:2)
根据tmpfile()手册页:
文件关闭或自动删除 程序终止。
我没有测试过,但它似乎应该做你想要的。
此外:
如果未设置TMPDIR,则默认位置为/ tmp。
然后,当重新启动时,/tmp
将为空。
答案 3 :(得分:0)
编辑:是
我检查了tmpfile源代码,它确实使用了glglgl技巧,并立即解锁了该文件。
原件:
我会说不。已经死了应该工作,但我会认为它可能发生,在硬重启后(例如由于电力输出)文件仍然存在。但这取决于您的Linux发行版和使用的设置。
如果临时文件是在ramdisk中创建的,那么它就消失了(那里有unix distris,例如使用基于ram的tmpfs作为临时文件)。
或者如果您使用的环境具有某些关于tmp的策略,它也可能已经消失(可能不是即时的,但通常有一些策略,例如删除/ tmp中未在一个月内访问的所有文件),但是它也可以在不强制执行此类规则的标准文件系统上。在这种情况下,文件将保留。
答案 4 :(得分:0)
通常的方法是设置一个信号处理程序,以便在程序中断时进行清理。这将无法处理kill -9
或无法捕获的物理重启。在/tmp
中创建临时文件,通常在系统引导时清除。剩下的就是教人们在他们不需要的时候不要使用kill -9
,但这似乎是一场艰苦的战斗。
答案 5 :(得分:0)
在linux中,mktemp
命令有效。