Java 为什么有些命令在Unix上需要锁,而有些命令不需要';T

Java 为什么有些命令在Unix上需要锁,而有些命令不需要';T,java,unix,aix,io-redirection,su,Java,Unix,Aix,Io Redirection,Su,最近,我在AIX7.1环境中观察到一些有趣的东西。为了解决这个问题,我用Java创建了一个小型锁定应用程序: 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

最近,我在AIX7.1环境中观察到一些有趣的东西。为了解决这个问题,我用Java创建了一个小型锁定应用程序:

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
运行成功。甚至使用以下命令写入文件:

cat /etc/passwd
cat /etc/passwd > /etc/passwd
也可以。现在,很明显,Java FileLock实现依赖于系统,因此没有指定的行为。然而,我好奇的是为什么‘苏’需要等待。“cat”重定向是否可能只是删除文件并使用新输出重新创建它,或者这只是命令之间锁定机制不一致的一种情况

Edit:自从我提出这个问题以来,我向Java应用程序添加了一些write语句,因此程序的结构如下所示:

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”和“>”(可能还有许多其他东西)之间有区别呢?

UNIX上的文件锁定是建议性的,而不是强制性的。也就是说,锁完全独立于文件,对试图读取或写入文件的任何人都没有影响。它只与试图获取锁的其他程序交互

由于
cat
和重定向不会尝试锁定文件,因此锁定对它们没有影响<另一方面,code>su会在读取/etc/passwd之前锁定它,因此持有锁的程序会使它等待(获取锁),直到释放它