c 如何加函数锁linux,linux C语言实现文件锁

本文介绍了flock()函数在C语言中的使用,用于对文件进行共享锁定和互斥锁定。通过示例代码展示了如何在多个进程中同步对同一文件的访问,避免数据冲突。洛克_NB选项允许在文件已锁定时避免进程阻塞。在进行文件操作前,应当先利用flock()检查并设置锁定,确保文件操作的正确性和安全性。
摘要由CSDN通过智能技术生成

flock函数说明

flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

表头文件 #include

定义函数 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

#include

#include

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

#include

#include

#include

#include

#include

#include

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函数的加锁是需要配合使用的,在文件操作之前,首先利用加锁成功与否来判定文件是否被加锁,若成功再进行后续的代码;否则表示文件被锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值