《UNIX网络编程 卷2》读书笔记(五)void my_lock(int fd)

《UNIX网络编程 卷2》读书笔记(五)static void rwlock_cancelrdwait(void *arg)

《UNIX网络编程 卷2》读书笔记(五)static void rwlock_cancelwrwait(void *arg)

如果想让进程只有一个拷贝运行,可以维护一个文件,在进程运行时先对其记录上写锁,则其他拷贝就无法获取到写锁,也就无法运行其他拷贝。

《UNIX网络编程 卷2》读书笔记(五)#include    "unpipc.h"
《UNIX网络编程 卷2》读书笔记(五)
#define    PATH_PIDFILE    "pidfile"
《UNIX网络编程 卷2》读书笔记(五)
int main(int argc, char **argv)

当然一个守护进程防止自身另一个拷贝的启动还有其他方法,比如可以使用信号灯。

      若以O_CREATEO_EXCL来调用open函数,则若文件存在,就返回一个错误,我们可以用这个技巧来将文件作为锁用。

《UNIX网络编程 卷2》读书笔记(五)#include    "unpipc.h"
《UNIX网络编程 卷2》读书笔记(五)
《UNIX网络编程 卷2》读书笔记(五)
#define    LOCKFILE    "/tmp/seqno.lock"
《UNIX网络编程 卷2》读书笔记(五)
《UNIX网络编程 卷2》读书笔记(五)
void my_lock(int fd)


这种技巧有三个问题:

1,若持有该锁的进程没有释放锁就终止了,则此文件名没有被删除,对于这个问有一些办法,比如检查文件的最近访问时间,若大于某个阀值,则认定它已经被遗忘了。另一个办法是把持有锁的进程ID写入锁文件中,则其他进程可以读出该进程ID,并去检查进程是否还在运行,但这也有问题,因为进程ID在过一段时间后是会重用的。但这些情形对于fcntl记录上锁来说都不成问题,因为进程终止时,它持有的记录锁都自动释放。

2,若已经有另外一个进程打开了锁文件,则当前进程只是在一个无限循环中不断调用open,也就是轮询。一个替代技巧是sleep一下,再尝试open.当然若使用fcntl进行记录上锁,这不成问题,只要想持有锁的进程指定FSETLKW命令,那么内核将把该进程投入睡眠,直到锁可用再唤醒它。

3,调用openunlink创建和删除额外一个文件涉及文件系统的访问,这比调用fcntl两次(一个获取锁,一次释放锁)所花时间长得多。

互斥锁和信号量的区别是:互斥锁必须总是由锁住它的线程来解锁,但信号量的signal却不必由执行过它的wait操作的同一个线程来执行。

相关文章:

  • 2022-12-23
  • 2021-06-20
  • 2021-10-30
  • 2022-03-07
  • 2021-09-29
  • 2022-02-22
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-14
  • 2021-12-11
  • 2021-09-24
相关资源
相似解决方案