“不适合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 $fhtesting操作符)。 如果文件是常规文件而不是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"; } 
    Interesting Posts