对文件进行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
^_^[root@:/home/crazybaby/A]#./b.out FCNTL ret = -1
若先运行mount过来的程序,记录锁也会生效的.