linux下檔案鎖

來源:互聯網
上載者:User
如何鎖檔案

有三種不同的檔案鎖,這三種都是“諮詢性”的,也就是說它們依靠程式之間的
合作,所以一個項目中的所有程式封鎖政策的一致是非常重要的,當你的程式需
要和第三方軟體共用檔案時應該格外地小心。

有些程式利用諸如 FIlENAME.lock 的檔案鎖檔案,然後簡單地測試此類檔案是否存在。這種方法顯然不太好,因為當產生檔案的進程被殺後,鎖檔案依然存在,這樣檔案也許會被永久鎖住。UUCP中把產生檔案的進程號PID存入檔案,但這樣做仍然不保險,因為PID的利用是回收型的。

這裡是三個檔案鎖函數:
     flock();
     lockf();
     fcntl();

flock()是從BSD中衍生出來的,但目前在大多數UNIX系統上都能找到,在單個主
機上flock()簡單有效,但它不能在NFS上工作。Perl中也有一個有點讓人迷惑的
flock()函數,但卻是在perl內部實現的。

fcntl()是唯一的符合POSIX標準的檔案鎖實現,所以也是唯一可移植的。它也同
時是最強大的檔案鎖--也是最難用的。在NFS檔案系統上,fcntl()請求會被遞
交給叫rpc.lockd的守護進程,然後由它負責和主機端的lockd對話,和flock()
不同,fcntl()可以實現記錄層上的封鎖。

lockf()只是一個簡化了的fcntl()檔案鎖介面。

無論你使用哪一種檔案鎖,請一定記住在鎖生效之前用sync來更新你所有的檔案
輸入/輸出。

   [code]   lock(fd);
      write_to(some_function_of(fd));
      flush_output_to(fd); /* 在去鎖之前一定要衝洗輸出 */
      unlock(fd);
      do_something_else;   /* 也許另外一個進程會更新它 */
      lock(fd);
      seek(fd, somewhere); /* 因為原來的檔案指標已不安全 */
      do_something_with(fd);[/code]      ...

一些有用的fcntl()封鎖方法(為了簡潔略去錯誤處理):

    [code] #include <fcntl.h>;
     #include <unistd.h>;
   
     read_lock(int fd)   /* 整個檔案上的一個共用的檔案鎖 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_RDLCK, SEEK_SET));
     }
   
     write_lock(int fd)  /* 整個檔案上的一個排外檔案鎖 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_SET));
     }
   
     append_lock(int fd) /* 一個封鎖檔案結尾的鎖,
                            其他進程可以訪問現有內容 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_END));
     }[/code]
前面所用的file_lock函數如下:

   [code]  struct flock* file_lock(short type, short whence)
     {
         static struct flock ret ;
         ret.l_type = type ;
         ret.l_start = 0 ;
         ret.l_whence = whence ;
         ret.l_len = 0 ;
         ret.l_pid = getpid() ;
         return &ret ;
     }[/code]  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.