2013-08-20 17 views
5

Linuxサーバー上でコマンドラインツールとして使用される一連のJavaプログラムがあります。それらのほとんどは、PerlのTerm::ProgressBarと同様に、STDERRのプログレスバーを表示するクラスを使用します。STDERRがターミナルに向かうかどうかの判断

STDERRがターミナルに行くたびにプログレスバーを表示し、STDERRがリダイレクトされたときに自動的に無効にして、リダイレクトされたデータにすべての種類のプログレスバーがないようにしたいと思います。

System.console() == nullをチェックするのは私の最初の考えですが、STDOUTがまだ端末に向いていても、このtrueにするにはSTDOUTをリダイレクトするだけで十分です。 STDERRに固有のことを確認できるものはありますか? Linux固有の、またはネイティブAPIを使用するソリューションは、私のニーズには問題ありません。

+0

http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream お楽しみ – UberDoyle

+0

@UberDoyle I:Makefile(変更のJavaは、あなたの$JAVA_HOME反映するために含まれます) Javaを使用して別のプロセスを起動することを求めていません。 *現在のプロセスのSTDERRがリダイレクトされているかどうかを知りたい。 –

答えて

1

あなたが探しているのはisatty(3)unistd.hです。ファイルハンドルがリダイレクトされたかどうかを知る方法はありませんが、それはまだインタラクティブかどうかを示します。 GNU coreutilsのttyコマンドのソースを参照してください。

+0

ioctlのどの機能を調べておくべきか知っていますか? ['ioctl'](http://www.linuxmanpages.com/man2/ioctl.2.php)、[' tty_ioctl'](http://www.linuxmanpages.com/man4)を読んだ後で、 /tty_ioctl.4.php)、['console_ioctl'](http://www.linuxmanpages.com/man4/console_ioctl.4.php)のマニュアルページを参照してください。 –

+0

私はどこを見たら分かったのか編集しました。 – chrylis

+0

@ user2284570ええ、それはJavaで実行できないためです。次? – chrylis

0

this answer@chrylis's pointerを組み合わせ、少し微調整を行った後、私は最終的になってしまったことである:

  1. ネイティブメソッドのシグネチャを持つCヘッダファイル
  2. を生成する
  3. 使用javahをJavaクラスを作成し、コンパイル
  4. を作成する.cppファイルを実装する関数isatty
  5. 共有ライブラリにC++コードをコンパイル
  6. を生成する

    package com.example.cli; 
    
    class LinuxTerminalSupport { 
    
        public native boolean isStderrVisible(); 
    
        static { 
         System.loadLibrary("term"); 
        } 
    } 
    

    Antターゲット:

    <target name="generate-native-headers"> 
        <javah destdir="native/" verbose="yes"> 
         <classpath refid="compile.class.path"/> 
         <class name="com.example.cli.LinuxTerminalSupport" /> 
        </javah> 
    </target> 
    

    .cppファイル:

    をカスタムライブラリが

Javaクラスでそれをどこに伝えるために-Djava.library.path=...を使用して

  • 実行するJavaプログラムで、
    #include "com_example_cli_LinuxTerminalSupport.h" 
    #include "unistd.h" 
    
    using namespace std; 
    
    JNIEXPORT jboolean JNICALL Java_com_example_cli_LinuxTerminalSupport_isStderrVisible(JNIEnv * env, jobject obj) { 
        return isatty(fileno(stderr)) == 1; 
    } 
    
    linux: LinuxTerminalSupport.o 
        g++ -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux \ 
          -o libterm.so -shared -Wl,-soname,term.so LinuxTerminalSupport.o -lc 
    
    LinuxTerminalSupport.o: LinuxTerminalSupport.cpp 
        g++ -c -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux LinuxTerminalSupport.cpp 
    
  • +0

    あなたはこのためにライブラリを作成する必要はありませんでした([INVENTED HERE](https://en.wikipediaを参照)。org/wiki/Not_invented_here#In_computing))。 isatty()はすでにglibcバイナリのエクスポートテーブルの一部であり、/lib64/libc.so.6または/lib/lib.so.6で見つけることができます(また、チェックしないので@ meにも通知してください手動で回答する) – user2284570

    +0

    @ user2284570 - 私は* is *を使用しました。 JNIラッパーなしでネイティブライブラリを使用する方法が分かっている場合は、そのことに関する情報は一度も見たことがありません。 –

    +0

    @ブラッドメイスのユーザーは、彼が何を言っているのか分かりません。 – chrylis

    関連する問題