5

ユーザーが 0 を入力すると終了する Java プログラムを作成する必要があります。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 から読み取りたいと思いますが、停止が呼び出されます。単純に、シェルスクリプトによってプログラムを明示的に閉じる必要があります。私は一生懸命努力しました。助けて。

編集 :

ユーザーが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()ため、ストリームの終わりを確認し、このためにを返します-1available()ストリームから読み取る前に呼び出して、ストリームに情報が含まれていることを確認してください。

于 2012-07-25T07:36:35.710 に答える
0

シェル スクリプトの先頭でを使用するset -mと (強制的にジョブ制御を有効にする)、一貫した動作が見られるはずです。

于 2012-08-28T11:54:03.090 に答える
0

スクリプトでコマンドをバックグラウンドで実行すると、そのコマンドの stdin が から暗黙的にリダイレクトされ/dev/nullます。

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