stdin输入可用性(竞争条件?)

时间:2016-12-05 11:06:14

标签: java linux bash shell operating-system

我在Java中编写一个命令行实用程序,它使用stdin或写入stdout,具体取决于使用System.in.available()在stdin上是否有可用的数据:

public class MyUtility {
    public static void main(String args[]) {
        if(System.in.available() > 0)
            consumeFromStdin();
        else
            produceToStdout();
    }

    // ...
}

我使用System.in.available()检查以避免使用命令行参数,使操作模式取决于它在shell中的使用方式(即java MyUtility | more对比echo testing | java MyUtility)。

到目前为止,这在Mac命令行中运行良好;在调用System.in.available()时,stdin可用性始终存在。我的问题是:即使用

调用该实用程序,也有可能
java MyUtility < input.txt

System.in.available()这里可能会返回0?

当然,我希望这适用于所有JVM实现,shell和操作系统。 Windows,Mac和Linux是否在生成进程时提供了对stdin数据可用性的不同(任何?)保证?而且,即使操作系统保证数据可用性,JVM是否对保证这些数据有任何发言权? shell(即ksh,csh,PowerShell等)是否起作用?

1 个答案:

答案 0 :(得分:1)

进程间通信独立于shell而存在。标准输入和标准输出是shell使用但不创建的操作系统机制。非shell的进程一直使用它们。

我对available()方法的规范知之甚少,但是如果你对Windows进行快速检查并且它有效,那么其余的操作系统大多是UNIX风格的,我认为,它很可能在任何地方都有效。