3

を使用していくつかの設定をファイルに保存するコードがありますFileOutputStream。これは、私が何千回も書いた標準コードです。

FileOutputStream out = new FileOutputStream(file);
try {
    BufferedOutputStream bos = new BufferedOutputStream(out);
    try {
        store(bos, comments);
    } finally {
        bos.close();
    }
} finally {
    out.close();
}

ユーザーの 1 人が、通話中に Linux で次のエラーを報告していclose()ます。

java.io.IOException: Inappropriate ioctl for device
   at java.io.FileOutputStream.close0(Native Method)
   at java.io.FileOutputStream.close(FileOutputStream.java:341)
   at java.io.FilterOutputStream.close(FilterOutputStream.java:160)

これが間違った -d32 または -d64 パラメータ (この質問のように) を使用して JVM を誤って起動した場合にのみ発生するのか、それとも何か他のことが起こっている可能性があるのか​​、誰かが知っていますか?

4

2 に答える 2

2

32/64ビットモードのアイデアであなたが正しいと確信しています。この問題は数年前に組み込みデバイスで作業していたときに発生しました。エラーは、pci スイッチと通信するために使用していたライブラリが原因であり、ライブラリは 64 ビット ioctl をサポートしていませんでした。

あなたが本当にそれを理解したいのであれば、私の提案です。私はこのテクニックを使ってjniコードをデバッグしました。Java アプリにブレーク ポイントを設定し、gdb を使用してプロセスにアタッチします。その後、gdb にブレーク ポイントを設定して、デバイスの ioctl を監視できます。デバイスに送信されている要求を確認し、そのアーキテクチャが正しくサポートされていることを確認します。

fileoutput ストリームが別のタイプのデバイス ファイルではなく、ファイル システム ファイルから読み取っている場合。次に、これはおそらく selinux の問題、または次のリンクにあるような chroot 環境のようなある種の仮想化の問題です。

このリンクは正しい方向を指している可能性があります。chroot の問題でした
http://us.generation-nt.com/answer/sndctl-tmr-timebase-tcgets-help-170073041.html

また、実行しているjreを必ず確認してください。それはopenjdkですか、それともsun Javaですか?古い gcc jdk Java には非常に奇妙な癖がありましたが、これがいくつかの不一致を説明している可能性があります。

于 2013-02-23T22:31:49.673 に答える
1

Java のメソッドは、OSネイティブの close()close()の薄いラッパーです。ネイティブ エラー コードを例外に変換します。

リンク先のドキュメントは、クローズが失敗する原因について比較的あいまいであり、書き込み中のエラーがクローズによって報告される可能性があること、および「これは特にNFSで観察される可能性がある...」と述べています。

したがって、デバッグするには、まずファイルの名前と、この特定のユーザーのファイルが保存されている場所を確認します。「不適切な ioctl」の非 close() 関連のヒットにはあまり重点を置きません。

于 2013-02-12T20:10:44.727 に答える