我有一个在AIX框中运行的Perl脚本.
该脚本尝试从某个目录打开一个文件,但由于该文件没有读取权限,因此无法读取该文件,但我得到了一个不同的错误inappropriate ioctl for device.
它不应该说类似的no read permissions for file东西吗?
这条inappropriate ioctl for device消息是什么意思?
我该如何解决?
编辑:这是我在做的时候发现的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)
hob*_*bbs 38
很可能这意味着开放并没有失败.
当Perl打开一个文件时,它会通过-T $fh对它发出TCGETSioctl 来检查文件是否是TTY(以便它可以回答filetest操作符).如果文件是常规文件而不是tty,则ioctl失败并将errno设置为ENOTTY(字符串值:"设备的不适当的ioctl").作为YSTH说,在看到一个意想不到的价值的最常见的原因$!是检查它时,它是无效的-也就是说,任何地方其他比后一个系统调用失败,所以测试你操作的结果代码是非常重要的.
如果open实际上没有给你返回false,你发现ENOTTY在$!那么我会认为这是一个小bug(给人一种无用的值$!),但我也将是它是如何发生的事情很好奇.代码和/或桁架输出会很漂亮.
“不适合设备的 ioctl”是 ENOTTY 错误的错误字符串。过去,它主要是通过尝试在非终端(但是,例如,常规文件)的文件描述符上配置终端属性(例如回声模式)来触发的,因此是 ENOTTY。更一般地说,它在不支持该 ioctl 的设备上执行 ioctl 时触发,因此是错误字符串。
要找出失败的 ioctl 以及哪个文件描述符,请在 strace/truss 下运行脚本。您将识别 ENOTTY,然后实际打印错误消息。然后找出使用了哪个文件号,以及哪个 open() 调用返回了该文件号。
由于这是一个致命错误并且也很难调试,也许修复程序可以放在某个地方(在提供的命令行中?):
export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)
来自:https : //github.com/keybase/keybase-issues/issues/2798
*nix类型系统中的"文件"是一个非常抽象的概念.
它们可以是由文件系统组织的磁盘上的区域,但它们同样可以是网络连接,一些共享内存,来自另一个进程的缓冲区输出,屏幕或键盘.
为了使perl非常有用,它会非常接近地镜像这个模型,并且不会像许多4gls那样通过模拟磁带来处理文件.
因此,它在文件句柄上尝试了"打开以进行写入"的"IOCTL"操作,该操作不允许写入操作,这对于该设备/文件来说是不合适的IOCTL操作.
最简单的方法是or die 'Cannot open $myfile' 在打开结束时粘贴" 声明",然后您可以选择自己有意义的消息.
| 归档时间: |
|
| 查看次数: |
188648 次 |
| 最近记录: |