2013-02-12 18 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,所以持有该锁的程序会导致它等待(获取锁),直到您释放它为止。