"设备不合适的ioctl"

som*_*guy 50 perl ioctl

我有一个在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(给人一种无用的值$!),但我也将是它是如何发生的事情很好奇.代码和/或桁架输出会很漂亮.


yst*_*sth 22

像"设备不适当的ioctl"这样的奇怪错误通常是检查$的结果!在系统调用失败之后的某个时刻.如果你显示你的代码,我打赌有人会迅速指出你的错误.


Mar*_*wis 8

“不适合设备的 ioctl”是 ENOTTY 错误的错误字符串。过去,它主要是通过尝试在非终端(但是,例如,常规文件)的文件描述符上配置终端属性(例如回声模式)来触发的,因此是 ENOTTY。更一般地说,它在不支持该 ioctl 的设备上执行 ioctl 时触发,因此是错误字符串。

要找出失败的 ioctl 以及哪个文件描述符,请在 strace/truss 下运行脚本。您将识别 ENOTTY,然后实际打印错误消息。然后找出使用了哪个文件号,以及哪个 open() 调用返回了该文件号。


Fel*_*ipe 6

由于这是一个致命错误并且也很难调试,也许修复程序可以放在某个地方(在提供的命令行中?):

export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)

来自:https : //github.com/keybase/keybase-issues/issues/2798

  • 不管你在说什么,这似乎与这个问题不同? (3认同)
  • 这个答案确实解决了我的问题。使用 [maven-gpg-plugin](https://maven.apache.org/plugins/maven-gpg-plugin/)(在 [WSL](https:// en.wikipedia.org/wiki/Windows_Subsystem_for_Linux),以防万一)。 (2认同)

Jam*_*son 5

*nix类型系统中的"文件"是一个非常抽象的概念.

它们可以是由文件系统组织的磁盘上的区域,但它们同样可以是网络连接,一些共享内存,来自另一个进程的缓冲区输出,屏幕或键盘.

为了使perl非常有用,它会非常接近地镜像这个模型,并且不会像许多4gls那样通过模拟磁带来处理文件.

因此,它在文件句柄上尝试了"打开以进行写入"的"IOCTL"操作,该操作不允许写入操作,这对于该设备/文件来说是不合适的IOCTL操作.

最简单的方法是or die 'Cannot open $myfile' 在打开结束时粘贴" 声明",然后您可以选择自己有意义的消息.