最近,我在我們的環境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'和'>'(以及其他許多事物)之間的區別?