【问题标题】:stdin input availability (race condition?)标准输入输入可用性(竞争条件?)
【发布时间】:2017-04-19 18:15:24
【问题描述】:

我正在用 Java 编写一个命令行实用程序,它使用标准输入或写入标准输出,具体取决于标准输入上是否有可用的数据,使用 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() 时,标准输入的可用性一直存在。我的问题是:有没有可能,即使在调用该实用程序时使用

java MyUtility < input.txt

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

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

【问题讨论】:

    标签: java linux bash shell operating-system


    【解决方案1】:

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

    我对@9​​87654321@ 方法的规范知之甚少,但是如果您在 Windows 上执行快速检查并且它可以工作,其余操作系统大多是 UNIX 风格,我认为有一个很高的它可能在任何地方都有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2016-07-26
      • 2021-01-07
      • 1970-01-01
      • 2012-04-02
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多