[英]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函数是线程安全的。
此外, freopen
在freopen(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.