質問
AIXボックスでPerlスクリプトを実行しています。
スクリプトは特定のディレクトリからファイルを開こうとしますが、ファイルに読み取り権限がないためファイルの読み取りに失敗しますが、 inappropriate ioctl for device
という別のエラーが表示されます。
ファイルの読み取り権限がありません
などのようなものではないでしょうか?
この不適切なioctl for device
メッセージはどういう意味ですか?
どうすれば修正できますか?
編集:これは strace
を実行したときに見つけたものです。
open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0 ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY (Inappropriate ioctl for device)
解決
ほとんどの場合、開いている失敗していません。
Perlは、ファイルを開くと、 TCGETS
-T $ fh filetest演算子に応答できるように)かどうかをチェックします>それに対するioctl。ファイルがttyではなく通常のファイルである場合、ioctlは失敗し、errnoを ENOTTY
に設定します(文字列値:" Inappropriate ioctl for device")。 ysthが言うように、 $!
に予期しない値が表示される最も一般的な理由は、それが無効な場合、つまり、システムコールが失敗した直後以外の other のときにそれをチェックすることです、操作の結果コードをテストすることは非常に重要です。
open
が実際にfalseを返し、 $!
で ENOTTY
を見つけた場合、これは小さなバグと考えられます(与える) $!
の役に立たない値ですが、私はそれがどのように起こったかについても非常に興味があります。コードやトラスの出力は気の利いたものになります。
他のヒント
「デバイスに不適切なioctl」などの奇妙なエラー通常、$をチェックした結果です!システムコールが失敗した直後以外の時点で。コードを表示する場合、誰かがすぐにエラーを指摘するだろうと思います。
"ファイル" * nix型システムでは、非常に抽象的な概念です。
ファイルシステムによって編成されたディスク上の領域でもかまいませんが、ネットワーク接続、ビット共有メモリ、別のプロセスからのバッファー出力、画面、キーボードなども同様に使用できます。
perlが本当に役立つように、このモデルは非常に密接にミラーリングされており、多くの4glが行うように磁気テープをエミュレートすることでファイルを扱いません。
したがって、「IOCTL」を試しました。そのデバイス/ファイルにとって不適切なIOCTL操作である書き込み操作を許可しないファイルハンドルでの操作「書き込みのために開く」。
最も簡単なことは、" またはあなたが開いた最後に「$ myfileを開けません」
ステートメントを死ぬと、あなたはあなた自身の意味のあるメッセージを選ぶことができます。
"デバイスの不適切なioctl" ENOTTYエラーのエラー文字列です。これは主に、端末ではないファイル記述子(たとえば、通常のファイル)で端末プロパティ(エコーモードなど)を構成しようとする試みによってトリガーされるため、ENOTTYです。より一般的には、ioctlをサポートしていないデバイスでioctlを実行するとトリガーされます。したがって、エラー文字列です。
どのioctlが失敗し、どのファイル記述子で実行されているかを調べるには、strace / trussの下でスクリプトを実行します。 ENOTTYが認識され、その後にエラーメッセージが実際に出力されます。次に、使用されたファイル番号と、そのファイル番号を返したopen()呼び出しを確認します。
このperlのバグを修正しました。 https://rt.perl.org/Ticket/Display.html?id=をご覧ください。 124232
バッファーレイヤーをPerlIOにプッシュし、失敗したisatty()チェックを行うとき これは明らかにすべての通常ファイルで失敗します。間違ったerrno ENOTTYを無視してください。
ユーリカの瞬間!
以前にこのエラーが発生しました。
perlデバッガーを次のように呼び出しましたか:-
perl -d yourprog.pl > log.txt
もしそうなら、perl debugは端末の幅を問い合わせ、おそらくリセットしようとします。 stdoutが端末でない場合、これはIOCTLメッセージで失敗します。
代わりの方法は、指示のプロンプトが表示されないため、デバッグセッションが永久にハングすることです。
これは致命的なエラーであり、デバッグも非常に難しいため、修正はどこかに(提供されたコマンドラインで?):
export GPG_TTY=$(tty)
From: https://github.com/keybase/keybase-issues/issues / 2798
今日、このエラーに遭遇したのは、コードを使用して、Centosサーバー上の共有としてマウントされているWindoze 7ボックスにあるフォルダー/ファイルを削除しようとしたときです。デバイスエラーの不適切なicotlを取得し、思いついたすべてを試してみました。これに関連するネット上のすべての投稿を読んでください。
明らかに、問題はLinuxサーバー上のマウントされたWindoze共有に特定されました。見た Windozeボックスのファイルアクセス許可で、ファイルのアクセス許可が読み取り専用に設定されていることに注意してください。
これらを変更し、Linuxサーバーに戻り、すべてが期待どおりに機能しました。ほとんどの場合、これは解決策ではないかもしれませんが、誰かの時間を節約できることを願っています。
動作していると思われる次のコードを試しました:
if(open(my $FILE, "<File.txt")) {
while(<$FILE>){
print "動作していると思われる次のコードを試しました:
<*>";}
} else {
print "File could not be opened or did not exists\n";
}