5

我必须制作一个java程序,当用户输入0时它应该退出。用java代码编写没问题。

int cmd = read();
System.out.println("got command : " + cmd);
if (cmd == 48) { // ASCII code for 0
System.exit(0);

我想在 linux 中使用 start-stop 脚本运行这个过程。我也可以使用&nohup

case "$1" in    
  'start')
    if [ -f myfifo ]; then
      rm myfifo
    fi
    mkfifo myfifo
    cat > myfifo &
    echo $! > myfifo-cat-pid
    java -jar myjar.jar >/dev/null 2>&1 0<myfifo &
    echo "Started process: "$!
    ;;

  'stop')
    echo 0 > myfifo
    echo "Stopped process: "
    rm myfifo
    ;;
esac

我的问题是,一旦我运行此过程,它就会读取输入-1。虽然我想从 stdinput 读取当somthing 明确地回显到它时,即调用停止。只是我需要一个程序被shell脚本明确关闭。我已经很努力了。帮我。

编辑 :

我只想在用户按下 q 或任何此类事件时关闭程序,并且不希望代码中出现无限循环。如果可能的话,任何其他方法(如监听其他事件)也会有所帮助。我的代码不应该轮询事件。我尝试过Jnotify在该目录中创建或删除文件时监视目录并引发事件。但不幸的是,他们不支持 SunOS。:(

4

4 回答 4

3

好吧,事实上,这些fifo文件的行为似乎并不像您想象的那样。

read()命令未阻塞管道。您应该循环直到获得数据:

    try {
        bis = new BufferedInputStream(System.in);
        while (true) {
            byte[] buffer = new byte[4096];
            if (bis.available() > 0) {
                bis.read(buffer, 0, bis.available());
                // do some clever thing
            } else {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    } catch (IOException e) {
        // it failed...
    }

这将尝试读取,如果没有,则等待 50 毫秒。

M。

于 2012-07-25T07:38:22.670 回答
1

由于管道中还没有数据,因此会read()看到流的结尾,因此它会返回-1. 在从流中读取之前调用available()以确保其中有信息。

于 2012-07-25T07:36:35.710 回答
0

如果您set -m在 shell 脚本的顶部使用(因此启用强制作业控制),您应该会看到一致的行为。

于 2012-08-28T11:54:03.090 回答
0

当您在脚本中执行命令时,该命令的标准输入会从/dev/null.

# test by executing a script with ...
- cat > myfifo & lsof -p $!
+ cat 0<&0 > myfifo & lsof -p $!
于 2016-03-22T15:21:27.603 回答