最近,我在我们的环境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'和'>'(以及其他许多事物)之间的区别?