linux C语言实现文件锁
flock函数说明
flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
返回值 返回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函数的加锁是需要配合使用的,在文件操作之前,首先利用加锁成功与否来判定文件是否被加锁,若成功再进行后续的代码;否则表示文件被锁
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。