2013-02-12 70 views
0

最近,我在我們的環境AIX 7.1上觀察了一些有趣的東西。在試圖追查這個問題,我在Java中創建一個小的鎖定程序:爲什麼有些命令在Unix上需要鎖而其他命令不需要?

import java.io.File; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 
import java.nio.channels.FileLock; 
import java.nio.channels.OverlappingFileLockException; 

public class Locker { 

    public static void main(String[] args) throws Exception { 
     File file = new File("/etc/passwd"); 
     FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 
     FileLock lock; 

     try { 
      lock = channel.tryLock(); 

      if (lock != null) { 
       System.out.println("I have the lock"); 
       while(true) {} 
      } 

     } catch (OverlappingFileLockException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

據我所知,這得在/ etc/passwd文件的讀寫鎖。如果我嘗試運行此應用程序的兩個實例,我只能按預期在一個實例中獲取鎖定。同樣,如果我運行此命令:

su user2 -c echo test 

命令掛起,直到我釋放從Java應用程序的鎖。另一方面,閱讀文件:

cat /etc/passwd 

成功運行。甚至寫入文件:

cat /etc/passwd > /etc/passwd 

也不錯。現在,顯然Java FileLock的實現是依賴於系統的,並且由於這種性質而沒有指定的行爲。然而,我很好奇的是爲什麼'蘇'需要等待。是否有可能'貓'重定向只是簡單地刪除文件並用新輸出重新創建它,或者這僅僅是鎖定機制跨命令不一致的一種情況?

編輯:既然問這個問題我加了一些寫語句的Java應用程序,該程序的結構如下:

Acquire Java Lock on /etc/passwd 
IO-Redirect with a small change to /etc/passwd 
Append some text to /etc/passwd in the Java application 

而這一切的信息都反映在更新的/ etc/passwd,所以看起來IO重定向不是簡單地刪除文件。因此,爲什麼'su'和'>'(以及其他許多事物)之間的區別?

回答

2

UNIX上的文件鎖定是建議性的,而不是強制性的。也就是說,鎖是完全獨立的,並且對試圖讀取或寫入文件的任何人都沒有影響。它只與試圖獲取該鎖的其他程序進行交互。

由於cat和重定向不會嘗試鎖定文件,鎖定對它們沒有影響。另一方面,在讀取它之前鎖定/ etc/passwd,所以持有該鎖的程序會導致它等待(獲取鎖),直到您釋放它爲止。