Linux IPC 同步(三):记录锁

进程间的互斥,我们可以让这些进程共享某个内存区(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不一样.

原文地址:https://www.cnblogs.com/xiaokuang/p/4619685.html