flock(),然后是fgets():低级锁,然后是stdio读/写库函数。可能吗?

时间:2012-04-21 14:24:44

标签: c stdio locks flock

我正在写一个服务器网站。

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

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

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

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

现在,我注意到了这个(Thread safe multi-file writing)解决方案,但我还想将函数用作fgets(),例如。

那么,我可以 flock()一个文件,然后使用fgets()或其他stdio读/写库函数吗?

1 个答案:

答案 0 :(得分:2)

首先,使用fcntl,而不是flock。后者是非标准的,已弃用的BSD函数,不适用于NFS和其他文件系统。另一方面fcntl锁定是POSIX标准,打算可以在任何地方使用。

现在,如果你想使用与stdio混合的文件级读写器锁定,它将起作用,但你必须小心确保缓冲不会破坏你对锁的假设。我要解释的方法不是唯一的方法,但我相信它是最清晰/最简单的方法:

如果你想使用stdio对你的一个文件进行操作,那么在fopen之后你应该首先获得正确类型的锁(读或写,也就是独占的共享)。使用fileno获取文件描述符编号并对其应用锁定。之后,执行整个读取或写入操作。 不要尝试解锁文件;相反,调用fclose关闭文件,并在文件关闭时隐式解锁。否则,您可以在未缓冲的数据仍然未写入时释放锁定,或者稍后读取在释放锁定之前缓冲的数据,在锁定释放后不再有效。