关于给文件加锁的问题
我现在要用c语言写个程序。有很多函数都要对同一个文件进行操作。我希望每个函数操作时都对文件加锁,防止其它函数的干扰,该怎么实现啊?因为要在linux和windows中都要实现,所以也请大虾说说两系统中的区别。
[解决办法]
Windows API: CreateFile()
HANDLE h = CreateFile(path,
GENERIC_READ,
0, //设为0即禁止共享
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
Linux可以用fcntl(),具体操作不清楚。而且能否实现进程内互斥也不知道。
[解决办法]
linux下比较方便的方法是:创建一个互斥量,在文件操作前对互斥量加锁,文件操作后,解锁。加锁采用phread_mutex_lock,如果互斥量已经被锁定,线程会阻塞,直到锁被释放,这样就可以避免多个线程同时操作这个文件,而且便于理解。
楼上说的fcntl函数也可以,可以用来锁定一个文件,一般守护进程的单实例运行就是采用的这个方法。
[解决办法]
linux下,如果你函数中的打印都是可以一个语句完成,我建议你可以使用pwrite函数来写文件,这是一个原子操作,不用担心线程间的同步问题。
[解决办法]
用信号亮,如果没有的话,可以用全局变量模拟实现一个
[解决办法]
互斥锁这样的通用同步机制,最大的问题是这样一个粒度的控制问题:
你究竟是每个文件使用一个互斥锁,还是所有文件用一把锁?
可惜两种选择都不够好。
[解决办法]
使用fcntl设置锁.不但可以对整个文件加锁,还可以分别对文件内不同的区域加缩.不过fcntl是个建议锁.非强制.
F_GETLK, F_SETLK and F_SETLKW are used to acquire, release, and test for the existence
of record locks (also known as file-segment or file-region locks). The third argument
lock is a pointer to a structure that has at least the following fields (in unspecified
order).
linux内有种强制锁,不过效率有点低.具体怎么用,可以去查一下.
使用信号量有点麻烦吧.