文件锁
文件锁的意义:
-
当多个进程同时访问同一个文件时,就有可能造成文件的数据读写混乱,为了解决这一问题可以在读写文件前给文件尝试并加锁
文件锁的限制:
-
一般情况下,系统提供的文件锁都是劝解锁,内核主要负责文件的加锁和检查是否上锁,而不直接参与锁的控制以及协同操作,这类锁就需要程序员每次用之前都要检查是否被别的进程加锁,再实现并发操作
int fcntl(int fd, int cmd, flock* lock ); 功能:对文件的某一部分进行锁操作 struct flock { short l_type; /* 锁的类型 F_RDLCK,读锁 F_WRLCK, 写锁 F_UNLCK 解锁*/ short l_whence; /* 偏移起点 SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* 偏移值 锁区起始位置:l_whence+l_start */ off_t l_len; /* 锁区长度 0表示锁到文件末尾*/ pid_t l_pid; /* 加锁的进程id -1表示让内核自动设置 */ }; cmd可选: F_GETLK 测试lock所表示的锁能否加锁 如果可以加则讲lock.l_type设置为F_UNLCK 否则会通过lock.l_type返回当前锁信息 F_SETLK 设置文件的锁定状态为lock.l_type 成功返回0,失败返回-1,如果有其他进程持有该锁导致加锁失败,返回EACCES or EAGAIN F_SETLKW 设置文件的锁定状态为lock.l_type 成功返回0,否则一直等待,除非被其它信号打断返回-1
进程A:读锁 进程B:读锁 可共享
进程A:写锁 进程B:读锁 互斥
进程A:读锁 进程B:写锁 互斥
进程A:写锁 进程B:写锁 互斥