我想在Linux上创建一个临时文件,确保该文件在我的程序终止后消失,即使它被杀死或者在错误的时刻执行了硬重启操作。使用tmpfile()
函数可以为我处理所有这些问题吗?
我想在Linux上创建一个临时文件,确保该文件在我的程序终止后消失,即使它被杀死或者在错误的时刻执行了硬重启操作。使用tmpfile()
函数可以为我处理所有这些问题吗?
glibc/stdio-common/tmpfile.c
。据我所知,它首先创建一个文件,然后删除它。 - thejhexit
中的任何清理都不会发生。 - daurnimatortmpfile()
,则可以在创建文件后立即使用unlink()
。它将保持打开状态并分配空间,直到被关闭。open()
和unlink()
之间发生了不太可能的情况,我的程序崩溃了,那么就会有一个空的、无用的文件,对吧?嗯,我想这比每次程序崩溃时都有一个大而无用的文件要好得多... - thejh您似乎关注的是文件可能因为一些竞态条件而被留下,但我看不到这是一个问题的解释。
"竞态条件指当程序出现意外事件顺序导致争用相同资源时,程序无法按照预期工作的情况。"
我假设您在其他答案中的评论中特别关注的是死锁,这是试图更正竞态条件(共享资源争用)的结果。如果您的应用程序真的如此脆弱,调用tmpfile()
并在该函数得到调用unlink()
之前出现异常终止,那么这已经是您最小的担忧了。
鉴于没有提到并发、线程或其他进程共享此临时文件的文件描述符,我仍然看不到竞态条件的可能性,也许只有逻辑上的不完整的事务概念,但是它可以被检测和清理。
确保清除任何分配的文件系统资源的正确方法不仅仅是在应用程序退出时,也包括在启动时。我的所有服务器代码都会在启动之前确保上一次运行的一切都被清理干净,然后才会变得可用。
将您的临时文件放在/tmp
的子目录中,并确保您的应用程序在启动和正常关闭时都会清理这个子目录。您可以使用一个shell脚本来包装您的应用程序启动,该脚本可以基于PID
存在检测异常(kill -9
)关闭,并执行清理活动。
mktemp
命令可以使用。tmpfile(3)
是c库中的一个函数。mktemp
是由GNU coreutils提供的我的操作系统上的一个独立程序。此外,mktemp
不会自动清理临时文件。 - Adam Monsen编辑:
我检查了tmpfile源代码,它确实使用了glglgl技巧,并立即解锁了文件。
原文:
我会说不。被杀死应该可以工作,但我会假设,在硬重启之后(例如由于断电),文件仍然存在。但这取决于您的Linux发行版和使用的设置。
如果临时文件是在ramdisk中创建的,则已经消失了(有一些Unix发行版使用基于RAM的tmpfs用于临时文件)。
或者,如果您使用具有某些关于tmp的策略的环境,它也可能已经消失(可能不是即时的,但通常有策略,例如删除一个月内未访问的/tmp中的所有文件),但它也可能在标准文件系统上,其中不强制执行此类规则。在这种情况下,文件将保留。
/tmp
看起来像是一个可行的解决方法...虽然在服务器上,仅在启动时进行清理可能不是一个好主意。我想一个 cronjob 或者其他方式应该可以做到对程序创建的文件进行清理,只需删除所有未打开的文件即可...但这仍然感觉不太好。 - thejhkill -9
或物理重启,因为它们无法被捕获。在/tmp
中创建临时文件,这通常在系统启动时被清除。剩下的就是教导人们不要在不需要的情况下使用kill -9
,但这似乎是一场艰苦的战斗。kill -9
某个东西。好吧,我想你对于 /tmp
是正确的 - 我应该定期清理它(看到那个文件夹里还有2011年的文件了)。然而,我不喜欢没有干净的方法来做这件事的想法... - thejh
open()
和unlink()
之间的时间窗口。 - thejh