0

我正在使用 tmpnam() 在进程 1 中生成一个临时文件名。打开该文件并将文件名发送到另一个进程 2。另一个进程 2 打开并写入该文件。

但是,我只是想知道我的进程 1 是否死了,文件是否会被操作系统删除。看起来好像没有发生这种情况。在那种情况下,我有什么选择,这样我的进程 1 死后就没有文件了。

4

2 回答 2

0

不,当您的进程终止时,内核不会删除打开的文件。

但是,您可以在进程终止之前删除打开的文件,只要您保持打开文件,该文件仍然会存在。但是,您将无法再按名称打开文件- 任何进一步的访问都只能通过打开的文件句柄。

例如

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。

于 2013-03-01T22:35:22.097 回答
0

操作系统不会为您删除文件。确定意图会很棘手:是用一些有用的数据写出的文件,还是现在该过程已经结束,它是无用的。

有几种方法可以考虑处理这个问题。在典型情况下,您会在退出过程中进行清理。如果你有问题,你几乎总能得到一个信号,你可以用它来清理东西。这里有一个例子: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/ 中,在那里它可以被清理,如果它被删除,以某种方式处理它。

于 2013-03-01T22:36:26.007 回答