我在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笔记本电脑,安装在它上,现在已经不能工作了。当我按下Ctrl时,程序继续等待输入,它不会被视为EOF。
经过一些调试(请参阅what is EOF in cygwin in windows 10中的注释),"stty -a“报告"eof = ^D;susp = ^Z",因此Ctrl将被视为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 10的组合中,似乎有一些东西被打破了。有什么提示,什么可以被打破和如何修复它?
注意:我正在使用java jdk-7u72。
当使用cygwin时,我使用windows本身的java安装。下面是一些用法:
In cygwin: javac Hello.java;java
然后给出输入,然后是新行中的^D (即输入返回后立即)。
windows中的:--我也尝试在windows中运行相同的程序,只是为了确定它是windows问题还是cygwin问题。所以这里我也运行: javac Hello.java;javac
然后给出输入,然后是新行中的^D (或^Z) (即输入返回后立即)。当我按^D或^Z键时,程序将正确终止。
发布于 2016-09-05 20:16:41
在非Cygwin Windows程序中,输入端的Ctrl会触发文件结束的情况.
在Cygwin程序中,在输入触发器和文件结束条件下使用Cygwin、Ctrl.(这可以用stty
命令重新配置,但您还没有这样做。)
程序如何执行并不重要。重要的是它是如何建造的。
您正在运行的程序是java
命令,它是一个非Cygwin可执行文件。( java
命令恰好在运行您的Java程序。)由于java
是一个非Cygwin程序,所以它将Ctrl作为文件结束字符.
据我所知,你所描述的所有行为都与此相符。
如果您想让Java程序像Cygwin程序一样运行,那么您必须使用为使用Cygwin而构建的Java系统。我不确定这是否可行,但这超出了这个问题的范围,所以我将把这个问题留给你和谷歌搜索。
https://stackoverflow.com/questions/39327818
复制相似问题