我在cygwin上使用java实用程序(antlr),java是windows版本,我从cygwin bash运行javac / java。
以下java代码用于在win8.1上运行cygwin,从stdin读取一系列数字直到EOF(改编自reading input till EOF in java):
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World");
Scanner in = new Scanner(System.in);
int num;
while (in.hasNextInt()) {
num = in.nextInt();
System.out.printf("%d\n",num);
}
}
}
最近我买了一台新的win10笔记本电脑,上面安装了cygwin,它不再用了。当我按下Ctrl-D时,程序继续等待输入,它不被视为EOF。
经过一些调试(参见what is EOF in cygwin in windows 10中的评论)," stty -a"报告" eof = ^ D; susp = ^ Z",所以Ctrl-D有望被视为EOF。 c ++中的以下等效代码按预期工作,可能是因为此代码是使用cygwin本身编译的,因此将^ D视为EOF。
#include <stdio.h>
int main() {
int i=0, status;
for(;;) {
printf("Enter a value %d:\n", i);
status = scanf("%d", &i);
if(status!=1) break;
}
}
所以在cygwin-win10的组合中似乎有些东西被打破了。什么提示,可以破坏什么以及如何修复它?
注意:我使用的是java jdk-7u72
使用cygwin时,我使用windows本身的java安装。以下是用法:
在cygwin中: javac Hello.java; java Hello
然后输入输入,然后在新行中显示^ D(即在输入Return后立即。
在Windows中:我也尝试在Windows中运行相同的程序,只是为了确定它是windows还是cygwin问题。所以这里我也运行:javac Hello.java; java Hello
然后给出输入,然后在新行中(即在输入Return后立即)^ D(或^ Z)。当我按^ D或^ Z时,程序正确终止。
答案 0 :(得分:0)
在非Cygwin Windows程序中,输入上的Ctrl-Z会触发文件结束条件。
在Cygwin程序中,使用Cygwin DLL,输入触发器上的Ctrl-D和文件结束条件。 (这可以使用stty
命令重新配置,但您还没有完成。)
程序的执行方式并不重要。只关系它是如何构建的。
您正在运行的程序是java
命令,它是非Cygwin Windows可执行文件。 (java
命令恰好运行Java程序。)由于java
是非Cygwin Windows程序,因此它将Ctrl-Z视为文件结束字符。
据我所知,你描述的所有行为都与此一致。
如果您希望Java程序像Cygwin程序一样运行,那么您必须使用构建为使用Cygwin的Java系统。我不确定这是否可行,但这超出了这个问题的范围,因此我会将此留给您和Google搜索。