函数简介
#include <sys/file.h>
int flock(int fd, int operation);
/*
* fd: 想要加锁的文件描述符(该文件必须已经打开才能获得文件描述符)
* operation: 加锁操作,共有 4 种情况:
* LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
* LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定,在文件上已经存在一个锁的情况下,函数会阻塞,直到该文件的所被解除。
* LOCK_UN 解除文件锁定状态。
* LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
* 单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
* 返回值:成功返回0,失败返回-1,同时错误码errno设置为相应的错误码。
* 另外,关闭文件描述符会导致 flock 自动解锁。
*/
代码示例
/*
* 此函数的使用很简单,代码套路大同小异
* 此处的代码演示了互斥锁的使用
* 同时程序执行结果说明了,关闭文件描述符会自动释放文件锁。
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/file.h>
int main()
{
int fd = open("./flock.c", O_RDONLY);
pid_t pid = fork();
if (pid < 0)
printf("fork failed.\n");
else if (pid > 0)
{
if (flock(fd, LOCK_EX) == 0)
printf("parent get flock success.\n");
sleep(2);
close(fd);
printf("parent close file, and sleep 10s.\n");
sleep(10);
}
else
{
sleep(2);
if (flock(fd, LOCK_EX) == 0)
printf("child get flock success.\n");
}
return 0;
}
试验结果如下图:
备注:
关闭文件描述符会自动释放文件锁,是一个很不错的优化,但是在多进程同步操作文件时,需要注意文件位置指针的问题。