进程间的互斥,我们可以让这些进程共享某个内存区(mmap实现),然后在该共享内存区中使用某种类型的同步变量
但是,fcntl记录上锁往往更容易使用。
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* struct flock *arg */ ); struct flock { ... short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_UNLCK */ short l_whence; /* How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* Starting offset for lock */ off_t l_len; /* Number of bytes to lock */ pid_t l_pid; /* PID of process blocking our lock (F_GETLK only) */ ... };
cmd的参数取值如下:
注:1. 记录上锁函数不应该同标准I/O库函数一起函数,因为这些库函数使用了内部缓冲。当对某个文件进行记录锁操作时,应配合使用read,write等系统调用。
2. 文件锁不能通过fork由子进程继承. 对于一个打开某个文件的给定进程来说, 当它关闭该文件所有的描述符或者它本身终止时, 与该文件的所有锁都被删除. 删除锁时关键的是进程ID(strcut flock中的l_pid字段)。既然锁和进程ID紧密相关联, 锁不能通过fork来继承也就顺理成章,因为父子进程的ID不一样.