74

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)
4

10 に答える 10

49

ほとんどの場合、それはオープンが失敗しなかったことを意味します。

Perl がファイルを開くとき、それに対して ioctl を-T $fh発行することによって、ファイルが TTY であるかどうかを (filetest オペレーターに応答できるように) チェックします。TCGETSファイルが tty ではなく通常のファイルである場合、ioctl は失敗し、errno をENOTTY(文字列値: "デバイスに不適切な ioctl") に設定します。ysth が言うように、予期しない値が表示される最も一般的な理由は、$!それが有効でないときにチェックすることです。つまり、syscall が失敗した直後以外の場所であるため、操作の結果コードをテストすることは非常に重要です

open実際に が false を返し、あなたがそれを見つけENOTTYた場合、$!これは小さなバグ ( の役に立たない値を与える$!) と見なしますが、それがどのように発生したかについても非常に興味があります。コードおよび/またはトラスの出力は気の利いたものになります。

于 2009-10-22T07:20:14.987 に答える
9

「デバイスに不適切な ioctl」は ENOTTY エラーのエラー文字列です。これは主に、端末ではないファイル記述子 (通常のファイルなど) で端末プロパティ (エコー モードなど) を構成しようとする試みによって引き起こされていたため、ENOTTY でした。より一般的には、ioctl をサポートしていないデバイスで ioctl を実行するとトリガーされるため、エラー文字列が発生します。

どの ioctl が失敗したか、およびどのファイル記述子で作成されているかを調べるには、strace/truss の下でスクリプトを実行します。ENOTTY に続いて、エラー メッセージの実際の出力が表示されます。次に、使用されたファイル番号と、そのファイル番号が返された open() 呼び出しを調べます。

于 2009-10-22T06:06:25.007 に答える
7

*nix 型システムの「ファイル」は、非常に抽象的な概念です。

それらは、ファイル システムによって編成されたディスク上の領域である可能性がありますが、ネットワーク接続、共有メモリ、別のプロセスからのバッファ出力、画面、またはキーボードである可能性もあります。

perl が本当に役立つようにするために、このモデルを非常に厳密に反映しており、多くの 4gl のように磁気テープをエミュレートすることによってファイルを処理しません。

そのため、そのデバイス/ファイルに対して不適切な IOCTL 操作である書き込み操作を許可しないファイル ハンドルに対して、「書き込み用に開く」操作「IOCTL」を試行しました。

最も簡単な方法は、「」or die 'Cannot open $myfile' ステートメントを最後に貼り付けて開くことで、意味のあるメッセージを選択できます。

于 2009-10-22T06:07:40.390 に答える
4

このperlのバグを修正しました。https://rt.perl.org/Ticket/Display.html?id=124232を参照してください。

バッファ層を PerlIO にプッシュし、すべての通常のファイルで明らかに失敗する isatty() チェックの失敗を実行すると、間違った errno ENOTTY を無視します。

于 2015-04-03T10:31:38.463 に答える
0

今日、コードを使用して、Centos サーバーに共有としてマウントされている Windoze 7 ボックスに存在するフォルダー/ファイルを削除しようとしたときに、このエラーが発生しました。デバイスエラーの不適切なicotlを取得し、思いついたすべてを試しました。これに関連するネット上のほぼすべての投稿を読んでください。

明らかに、問題は Linux サーバーにマウントされた Windoze 共有に切り分けられました。Windoze ボックスのファイルのアクセス許可を調べたところ、ファイルのアクセス許可が読み取り専用に設定されていることがわかりました。

それらを変更し、Linux サーバーに戻り、すべてが期待どおりに機能しました。これはほとんどの人にとって解決策ではないかもしれませんが、誰かの時間を節約できることを願っています.

于 2013-03-10T18:16:50.890 に答える
0

Can't open file for reading. Inappropriate ioctl for device最近、DBM ファイルベースのデータベースを使用する古い UB2K フォーラムを新しいホストに移行したときにエラーが発生しました。互換性のない DBM の実装が複数あるようです。データベースのバックアップがあったので、それをロードできましたが、他のオプションがあるようです。たとえば、perl スクリプト/dbm を新しいサーバーに移動したり、dbm から移行したりしますか? .

于 2020-12-11T08:03:01.990 に答える