我正在编写一个服务器网络。
每个连接都由一个单独的线程提供服务,因此我事先不知道线程的数量。
还有一组文本文件(也不知道数量),每个线程都可以对每个文件进行读/写。
一个文件一次只能由一个线程写入,但不同的线程可以同时写入不同的文件。
如果一个文件被一个或多个线程读取(读取可以是并发的),则没有线程可以在该文件上写入。
现在,我注意到这个( Thread safe multi-file writing )解决方案,但我还想使用函数,例如 fgets() 。
那么,我可以flock()一个文件,然后使用fgets()或其他stdio读/写库函数吗?
最佳答案
首先,使用fcntl
,而不是flock
。后者是一个非标准的、已弃用的 BSD 函数,并且不适用于 NFS 和其他可能的文件系统。另一方面,fcntl
锁定是 POSIX 标准,并且旨在在任何地方都可以工作。
现在,如果您想将文件级读写器锁定与 stdio 混合使用,它会起作用,但您必须小心以确保缓冲不会破坏您对锁的假设。我要解释的方法不是唯一的方法,但我相信这是最清晰/最简单的:
当您想使用 stdio 操作一个文件时,获取正确类型的锁(读或写,又名共享或独占)应该是 fopen
之后要做的第一件事。使用 fileno
获取文件描述符编号并向其应用锁。之后,执行整个读取或写入操作。 请勿尝试解锁文件;相反,调用 fclose
来关闭文件并让它在关闭时隐式解锁。否则,您可能会在未缓冲的数据尚未写入时释放锁,或者稍后读取释放锁之前缓冲的数据,这些数据在锁释放后不再有效。
关于c - flock(),然后是 fgets() : low-level locks,,然后是 stdio 读/写库函数。是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259752/