flock函数说明
flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
表头文件 #include<sys/file.h>
定义函数 int flock(int fd,int operation);
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
示例代码
test1.c:
#include <sys/file.h> #include <stdio.h> #include <stdlib.h> int main() { FILE *f = fopen("temp", "w+"); if(!f) { printf("error file\n"); return 0; } if(0 == flock(fileno(f), LOCK_EX)) { printf("lock...\n"); getchar(); fclose(f); flock(fileno(f), LOCK_UN); } else { printf("lock failed\n"); } return 0; }
test2.c
#include <sys/stat.h> #include <sys/types.h> #include <sys/file.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <fcntl.h> int main() { FILE *fp; char text[]="this is a test!"; if((fp = fopen("temp", "w+")) == 0) printf("can‘t open file!\n"); else { printf("open file success!\n"); int i = flock(fileno(fp), LOCK_SH | LOCK_NB); // 加锁以判断文件是否已经被加锁了 printf("%d\n", i); flock(fileno(fp), LOCK_UN); fwrite(text, strlen(text), 1, fp); } fclose(fp); return 0; }
测试如下:
在终端1中,运行test1
在终端2中,运行test2
这里主要说明的是在test2.c中,对文件的操作也是要利用加锁来判断文件是否已经被加锁了,
int i = flock(fileno(fp), LOCK_SH | LOCK_NB);
上面这行代码就是实现这个功能, 注意第二个参数,如果没有LOCK_NB的话,若文件已加锁则会进程阻塞,而上面的方式则不会出现这种问题;另外第一个参数,切勿直接传入(int)fp
i == 0 表示文件加锁成功, i == -1 表示文件已被加锁,不建议执行后续操作
小结:
flock函数的加锁是需要配合使用的,在文件操作之前,首先利用加锁成功与否来判定文件是否被加锁,若成功再进行后续的代码;否则表示文件被锁
时间: 2024-10-16 10:18:13