繁体   English   中英

将在Linux上已fclosed()的FILE *文件flockfile()安全吗?

[英]Is it safe to flockfile() a FILE* that has been fclosed()ed on linux?

这样的代码在Linux上是否安全,在某种意义上说:1)它不会崩溃并且无法读取free()ed内存,并且2)freopen()ed文件与fclose()ed文件共享相同的锁计数?

线程1:

flockfile(file);
freopen("name", a", file);
funlockfile(file);

线程2:

flockfile(file);
fputs("stuff", file);
funlockfile(file);

在关闭的FILE*上没有安全的操作。 fclose(3)

...对该流的任何进一步访问(包括对fclose()的另一次调用)都会导致未定义的行为。

这是因为fclose (可能)释放了文件指针指向的对象。

但是,它是绝对安全的锁定流,同时freopen荷兰国际集团作为锁拴在流,而不是底层的文件。 事实上,根据flockfile(3)

stdio函数是线程安全的。

此外, freopenfreopen(3)中也标记为“ MT安全”。 因此, freopen必须在内部使用该锁1,以避免在另一个线程(例如, freopen时关闭基础文件描述符。 因此,将它带到外部必须安全(锁是可重入的)。

最后,您实际上不需要对flockfile那些调用,因为所有文件操作无论如何都已经是线程安全的。


1我已经验证(通过阅读源代码)在调用freopen时glibc和openbsd的libc(也在android上使用)都在内部锁定了流。

glibc freopen代码以以下内容打开:

FILE*
freopen (filename, mode, fp)
     const char* filename;
     const char* mode;
     FILE* fp;
{
  FILE *result;
  CHECK_FILE (fp, NULL);
  if (!(fp->_flags & _IO_IS_FILEBUF))
    return NULL;
  _IO_acquire_lock (fp); // <-- This a macro that calls the private equivalent of flockfile and does some gcc cleanup magic.

并关闭:

  _IO_release_lock (fp);
  return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM