c - flock(),然后是 fgets() : low-level locks,,然后是 stdio 读/写库函数。是否可以?

标签 c stdio locks flock

我正在编写一个服务器网络。

每个连接都由一个单独的线程提供服务,因此我事先不知道线程的数量

还有一组文本文件(也不知道数量),每个线程都可以对每个文件进行读/写。

一个文件一次只能由一个线程写入,但不同的线程可以同时写入不同的文件。

如果一个文件被一个或多个线程读取(读取可以是并发的),则没有线程可以在该文件上写入。

现在,我注意到这个( 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/

相关文章:

c - 使用 sscanf 从字符串中提取(可能为空)单词(以 "|"分隔)

c - 是否有新的即将推出的 C 标准来取代 C99?

c - 不确定地从两个管道中读取,然后在 C 中的标准输出上打印

java - 如何确定条件变量上等待时间最长的线程?

c - 如何调试在调试器中运行的 C 代码?

c - 无法计算正确的平均值

c - C语言中while循环内的fscanf问题

php - 从 PHP 写入标准输入?

python - 如何在Python中使用锁允许多个线程更改对象的不同部分?

java - java 类中的锁