“不适合ioctl的设备”
我有一个运行在AIX框中的Perl脚本。
该脚本试图从某个目录打开一个文件,它无法读取文件,因为文件没有读取权限,但我得到一个不同的错误,说inappropriate ioctl for device
。
不应该说像no read permissions for file
或类似的东西?
这个inappropriate ioctl for device
信息inappropriate ioctl for device
是什么意思?
我该如何解决?
编辑:这是我当我strace
时发现的。
打开(“/ 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打开一个文件时,它会检查文件是否是TTY(以便它可以通过发出TCGETS
ioctl来回答-T $fh
testing操作符)。 如果文件是常规文件而不是tty,则ioctl失败并将errno设置为ENOTTY
(string值:“设备的不当ioctl”)。 正如ysth所说,在$!
看到意外值的最常见的原因$!
当它无效时,即在系统调用失败之后的任何地方进行检查,因此testing操作的结果代码至关重要。
如果open
实际上为您返回false,并且您在$!
find了ENOTTY
$!
那么我会认为这是一个小错误(给$!
的无用价值$!
),但我也会很好奇它是如何发生的。 代码和/或桁架输出将是很好的。
奇怪的错误,如“不适当的设备的ioctl”通常是检查$的结果! 在系统调用失败之后的某个时刻。 如果你要显示你的代码,我敢打赌有人会迅速指出你的错误。
* nixtypes系统中的“文件”是非常抽象的概念。
它们可以是由文件系统组织的磁盘区域,但它们同样可以是networking连接,共享内存,另一个进程的缓冲区输出,屏幕或键盘。
为了使perl真正有用,它非常接近地反映了这个模型,并且不像许多4gls那样模仿磁带来处理文件。
所以它试图在不允许对该设备/文件进行不适当的IOCTL操作的写入操作的文件句柄上进行“IOCTL”操作。
最简单的做法是坚持“ or die 'Cannot open $myfile'
在打开结束时or die 'Cannot open $myfile'
语句,你可以select自己有意义的消息。
“设备不适当的ioctl”是ENOTTY错误的错误string。 它过去主要是通过尝试在没有terminal的文件描述符(也就是普通文件)上configurationterminal属性(例如回显模式)触发的,因此ENOTTY。 更一般地说,它是在不支持ioctl的设备上执行ioctl时触发的,因此是错误string。
要找出哪个ioctl失败,以及哪个文件描述符,在strace / truss下运行脚本。 您将识别ENOTTY,然后是实际打印的错误消息。 然后找出使用了哪个文件编号,以及open()调用返回了哪个文件编号。
尤里卡一刻!
我以前有过这个错误。
你有没有像调用Perldebugging器:
perl -d yourprog.pl > log.txt
如果是这样的话,perl debug会尝试查询并重置terminal宽度。 当stdout不是terminal时,IOCTL消息失败。
另一种方法是将debugging会话永久挂起,因为您没有看到提示的提示。
我只是修复了这个Perl错误。 请参阅https://rt.perl.org/Ticket/Display.html?id=124232
当我们将缓冲层推入PerlIO并执行失败的isatty()检查时,在所有普通文件上明显失败,忽略错误的errno ENOTTY。
在尝试使用代码删除一个文件夹/文件时,如今在今天出现此错误,这些文件夹位于作为共享安装在Centos服务器上的Windoze 7框中。 得到不适当的icotl设备错误,并试图想到的一切。 请阅读与此相关的每一篇文章。
显然这个问题被孤立在Linux服务器上的Windoze共享上。 看着Windoze框上的文件权限,并注意到这些文件的权限设置为只读。
改变了这些,回到Linux服务器,并按预期工作。 这可能不是大多数解决scheme,但希望能够节省一些时间。
我试了下面的代码似乎工作:
if(open(my $FILE, "<File.txt")) { while(<$FILE>){ print "$_";} } else { print "File could not be opened or did not exists\n"; }