标准输入可用性(竞态条件?)

3

我正在用Java编写一个命令行实用程序,根据stdin中是否有数据可用,它可以消耗stdin或写入stdout,使用System.in.available()来判断:

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

    // ...
}

我正在使用System.in.available()检查来避免使用命令行参数,以使操作模式取决于它在shell中的使用方式(例如:java MyUtility | moreecho testing | java MyUtility)。
到目前为止,这在Mac命令行上运作良好; 在调用System.in.available()时,stdin可用性始终存在。我的问题是:即使使用下面的命令调用该实用程序,是否仍然可能存在没有stdin可用的情况?
java MyUtility < input.txt

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

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

1个回答

1

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

我不太了解available()方法的规范,但如果您在Windows上进行快速检查并且它可以工作,则其他大多数基于UNIX的操作系统也应该能够工作,因此我认为它很可能会在任何地方都能够工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接