我正在使用 tmpnam() 在进程 1 中生成一个临时文件名。打开该文件并将文件名发送到另一个进程 2。另一个进程 2 打开并写入该文件。
但是,我只是想知道我的进程 1 是否死了,文件是否会被操作系统删除。看起来好像没有发生这种情况。在那种情况下,我有什么选择,这样我的进程 1 死后就没有文件了。
不,当您的进程终止时,内核不会删除打开的文件。
但是,您可以在进程终止之前删除打开的文件,只要您保持打开文件,该文件仍然会存在。但是,您将无法再按名称打开文件- 任何进一步的访问都只能通过打开的文件句柄。
例如
fname="/tmp/tempfilename";
fd=open(fname,O_RDWR);
unlink(fname);
/* fd is still a valid handle that can be written to, read from,
lseeked on, or passed to a child process. It will go away
when the process exits.
*/
/* Important note: if you create a temp file like this on a
NFS filesystem, there will be a phantom file named something like
.nfsfile12983719
that will stick around until the file descriptor is closed.
If you delete this file, it will be re-created.
*/
或者,您可以使用tmpfile(3)
which 做大致相同的事情,只是它返回 aFILE *
而不是 fd。
操作系统不会为您删除文件。确定意图会很棘手:是用一些有用的数据写出的文件,还是现在该过程已经结束,它是无用的。
有几种方法可以考虑处理这个问题。在典型情况下,您会在退出过程中进行清理。如果你有问题,你几乎总能得到一个信号,你可以用它来清理东西。这里有一个例子:Basic Signal Handling,我在这里举了这个例子。
#include <signal.h>
void
termination_handler (int signum)
{
struct temp_file *p;
for (p = temp_file_list; p; p = p->next)
unlink (p->name);
}
int
main (void)
{
...
if (signal (SIGINT, termination_handler) == SIG_IGN)
signal (SIGINT, SIG_IGN);
if (signal (SIGHUP, termination_handler) == SIG_IGN)
signal (SIGHUP, SIG_IGN);
if (signal (SIGTERM, termination_handler) == SIG_IGN)
signal (SIGTERM, SIG_IGN);
...
}
另一种选择是在文件名(或文件内容)中嵌入一个 pid。如果您的程序启动并看到一个 pid 与您的程序正在运行的实例不对应的文件,您可以尝试清理它。这似乎有点危险。
另一个稍微有点臭的解决方案是将它放在 /tmp/ 中,在那里它可以被清理,如果它被删除,以某种方式处理它。