fcntl 与 NFS

   对文件进行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 
fcntl 与 NFS

如果没有都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过来的程序,记录锁也会生效的.



原文链接: http://blog.csdn.net/crazyjixiang/article/details/6939192

你可能感兴趣的:(fcntl 与 NFS)