AIXボックスでPerlスクリプトを実行しています。
スクリプトは特定のディレクトリからファイルを開こうとしますが、ファイルに読み取り権限がないためファイルの読み取りに失敗しますが、inappropriate ioctl for device
という別のエラーが表示されます。
no read permissions for file
などのようなものを言うべきではありませんか?
このinappropriate 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またはTCGETS、0xbffc14f8)= -1 ENOTTY (デバイスの不適切なioctl)
ほとんどの場合、オープン失敗しなかったを意味します。
Perlはファイルを開くときに、TCGETS
ioctlを発行することにより、ファイルがTTY(-T $fh
filetest演算子に応答できるように)かどうかをチェックします。ファイルがttyではなく通常のファイルである場合、ioctlは失敗し、errnoをENOTTY
(文字列値:「デバイスの不適切なioctl」)に設定します。 ysthが言うように、$!
に予期しない値が表示される最も一般的な理由は、それが有効ではないときにチェックすることです。つまり、syscallが失敗した直後よりもどこでもotherです。操作の結果コードは非常に重要です。
open
が実際にfalseを返し、$!
でENOTTY
を見つけた場合、これは小さなバグ($!
の役に立たない値を与える)と考えますが、また、それがどのように起こったかについても非常に興味があります。コードやトラスの出力は気の利いたものになります。
「デバイスの不適切なioctl」のような奇妙なエラーは、通常$!をチェックした結果です。システムコールが失敗した直後以外の時点で。あなたのコードを見せてくれたら、誰かがあなたのエラーをすぐに指摘するだろうと思います。
* nix型システムの「ファイル」は非常に抽象的な概念です。
ファイルシステムによって編成されたディスク上の領域でもかまいませんが、ネットワーク接続、共有メモリのビット、別のプロセスからのバッファー出力、画面、キーボードなども同様に使用できます。
Perlが本当に役立つように、このモデルは非常に密接にミラーリングされており、多くの4glが行うように磁気テープをエミュレートすることでファイルを扱いません。
そのため、デバイス/ファイルにとって不適切なIOCTL操作である書き込み操作を許可しないファイルハンドルで「書き込み用に開く」「IOCTL」操作を試みました。
最も簡単なことは、「or die 'Cannot open $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デバッグはクエリを実行し、おそらく端末幅をリセットしようとします。 stdoutが端末でない場合、これはIOCTLメッセージで失敗します。
別の方法は、指示のプロンプトが表示されないため、デバッグセッションが永久にハングすることです。
これは致命的なエラーであり、デバッグも非常に難しいため、修正はどこかに(提供されたコマンドラインで?)
export GPG_TTY=$(tty)
今日、このエラーに遭遇したのは、コードを使用して、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";
}