I have a Perl script running in an AIX box.
The script tries to open a file from a certain directory and it fails to read the file because file has no read permission, but I get a different error saying
inappropriate ioctl for device.
Shouldn’t it say something like
no read permissions for file or something similar?
What does this
inappropriate ioctl for device message mean?
How can I fix it?
EDIT: This is what I found when I did
open("/local/logs/xxx/xxxxServer.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = 4 _llseek(4, 0, , SEEK_END) = 0 ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc14f8) = -1 ENOTTY (Inappropriate ioctl for device)
Most likely it means that the open didn’t fail.
When Perl opens a file, it checks whether or not the file is a TTY (so that it can answer the
-T $fh filetest operator) by issuing the
TCGETS ioctl against it. If the file is a regular file and not a tty, the ioctl fails and sets errno to
ENOTTY (string value: “Inappropriate ioctl for device”). As ysth says, the most common reason for seeing an unexpected value in
$! is checking it when it’s not valid — that is, anywhere other than immediately after a syscall failed, so testing the result codes of your operations is critically important.
open actually did return false for you, and you found
$! then I would consider this a small bug (giving a useless value of
$!) but I would also be very curious as to how it happened. Code and/or truss output would be nifty.