fopen()是Linux中的线程安全函数吗?

fopen()是Linux中的线程安全函数吗?,第1张

fopen()是Linux中的线程安全函数吗?

如果两个线程都使用来打开同一文件

fopen()
,则它们各自将具有独立的文件流(
FILE*
),并由引用同一文件的独立文件描述符支持。您可以独立地写入两个文件流,但是文件的最终结果将取决于线程在何处写入以及何时刷新文件流。除非您控制每个线程的写入位置,否则结果是不可预测的。最简单的事情是确保两个线程使用相同的文件流,但是您可能仍需要在线程之间进行协调。请注意,POSIX需要使用C函数来提供对文件流的协调访问-
请参阅
flockfile()
其中的要求

引用

(FILE*)
对象的所有函数(名称以结尾的函数除外)
_unlocked
都应像它们在内部使用
flockfile()
funlockfile()
获得这些(FILE
*)对象的所有权一样。

如果在两个线程中都以追加模式打开文件,则每次写入都会在文件末尾安全地进行,但是您仍然需要担心在缓冲区填充之前刷新数据。

顺便说一句,如果您以追加模式(

O_APPEND
with
open()
,using
"a"
with
fopen()
)打开文件,则所有写 *** 作都应在文件的末尾,并且您不会遇到交错写 *** 作的麻烦—除非,也许您的独立线程正在使用文件流并且一次写入不止一个缓冲区已满,或者它们是
fflush()
在写入输出的每一行之后使用的,或者它们是在使用
write()
其众多亲戚中的一个或其每次写入一行的一部分。即使使用追加模式,也有可能遇到问题的方法,但是通常您必须尝试解决这些问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4914992.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存