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 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)
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.
If open
actually did return false for you, and you found ENOTTY
in $!
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.