fcntl 与 NFS

本文介绍了在NFS环境中使用文件锁的方法,指出flock仅适用于本地文件系统,并推荐使用fcntl替代。通过具体示例展示了如何在C语言中实现fcntl文件锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对文件进行flock加独占锁时,只对本机文件起作用,且只对两人达成这个"协商"的程序起作用. 而通过RPC Service的访问,flock是不起作用的. 这个时候 如果你使用man flock.帮助中会有

flock() does not lock files over NFS. Use fcntl(2) instead: that does work over NFS, given a sufficiently recent version of Linux and a server which supports locking.

这么一句. 也就是说 flock不支持,可以通过fcntl这个函数来代替.

Install NFS

Fedora 可以通过 yum install portmap nfs-utils 来进行安装

安装好后进行配置 etc/exports

/opt 192.168.153.164(rw,sync,no_root_squash)

/opt 共享目录

192.168.153.164 为运行mount的主机IP

rw-> 读写权限, sync实时写入硬盘 async 先写入内存再写入硬盘, no_root_squash->开放root身份

保存,然后重新启动nfs :

/etc/rc.d/init.d/nfs restart

如果没有都OK 建议再次restart 或者对重启机子.

然后客户端主机就可以使用mount命令对其进行mount了.我们来写个fcntl的程序测试下.

1 #include <Akita/Akita.h> 2 #include <sys/file.h> 3 #include <fcntl.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <sys/stat.h> 7 int main(int argc, const char *argv[]) 8 { 9 int fd = open("./main.c", O_RDWR); 10 if (fd<0) { 11 printf("%s\n","Open File error!"); 12 } 13 //int ld = flock(fd, LOCK_EX); 14 struct flock lock; 15 lock.l_whence = SEEK_SET; 16 lock.l_start = 0; 17 lock.l_len = 0; 18 lock.l_type = F_WRLCK; 19 int fld = fcntl(fd, F_SETLK, &lock); 20 printf("FCNTL ret = %d\n", fld); 21 if (fld == 0) { 22 if (lock.l_type == F_WRLCK) { 23 printf("WRLCK PID = %d\n", getpid()); 24 25 } 26 27 } 28 getchar(); 29 return 0; 30 }本机运行 此程序生成的一个目标程序, 程序会正常返回:

^_^[root@:/opt]#./a.out FCNTL ret = 0 WRLCK PID = 4391
另外一台mount过来的目录中运行一个目标程序:

^_^[root@:/home/crazybaby/A]#./b.out FCNTL ret = -1

若先运行mount过来的程序,记录锁也会生效的.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值