1. ホーム
  2. perl

[解決済み] "デバイスに不適切なioctl"

2022-01-28 07:23:17

質問

AIXマシンでPerlスクリプトを走らせています。

このスクリプトは、あるディレクトリからファイルを開こうとして、ファイルに読み取り権限がないため、ファイルの読み取りに失敗しますが、別のエラーメッセージが表示されます。 inappropriate ioctl for device .

次のように表示すべきではありませんでしょうか。 no read permissions for file というようなことでしょうか?

この inappropriate ioctl for device のメッセージはどういう意味ですか?

どうすれば直せますか?

EDIT:したらこうなりました。 strace .

open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE.O_WRONLY|O_CREAT|O_CREAT|O_APPEND|O_LARGEFILE.O_WRONLY|O_WRONLY), 
    0666) = 4 _llseek(4, 0, [77146], SEEK_END) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY 
    (デバイスに不適切なioctl)

解決方法は?

ほとんどの場合、開いている 失敗していない .

Perl がファイルを開くとき、ファイルが TTY かどうかをチェックします。 -T $fh filetest 演算子) を発行しています。 TCGETS ioctlを使用します。ファイルが tty ではなく通常のファイルである場合、ioctl は失敗し、errno に ENOTTY (文字列値: "Inappropriate ioctl for device")です。ysth が言うように、予期しない値を示す最も一般的な理由は $! は、それが有効でないときにチェックされます。 その他 そのため、操作の結果コードをテストすることは非常に重要です。

もし open が実際に false を返した場合、あなたが見つけたのは ENOTTY$! という無駄な値を与えてしまうこと)、これは小さなバグだと考えています。 $! しかし、どうしてこのようなことが起こったのか、非常に興味があります。コードやトラス出力があると助かります。