perl - "Ioctl inapropiado para el dispositivo"
(8)
"ioctl inapropiado para el dispositivo" es la cadena de error para el error ENOTTY. Solía desencadenarse principalmente por intentos de configurar propiedades de terminal (por ejemplo, modo de eco) en un descriptor de archivo que no era un terminal (sino, por ejemplo, un archivo normal), por lo tanto, ENOTTY. De manera más general, se activa cuando se realiza una ioctl en un dispositivo que no admite esa ioctl, de ahí la cadena de error.
Para averiguar qué falla ioctl y qué descriptor de archivo, ejecute el script bajo strace / truss. Reconocerá ENOTTY, seguido de la impresión real del mensaje de error. A continuación, averigüe qué número de archivo se utilizó y qué llamada de apertura () devolvió ese número de archivo.
Tengo un script de Perl ejecutándose en una caja de AIX.
La secuencia de comandos intenta abrir un archivo de un directorio determinado y no puede leer el archivo porque el archivo no tiene permiso de lectura, pero aparece un error diferente al inappropriate ioctl for device
.
¿No debería decir algo así como no read permissions for file
o algo similar?
¿Qué significa este inappropriate ioctl for device
mensaje del inappropriate ioctl for device
?
¿Cómo puedo arreglarlo?
EDITAR: Esto es lo que encontré cuando hice 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)
Acabo de arreglar este error Perl. Ver https://rt.perl.org/Ticket/Display.html?id=124232
Cuando empujamos la capa de búfer a PerlIO y realizamos una comprobación fallida de isatty (), que obviamente falla en todos los archivos normales, ignoramos el error errno ENOTTY.
Errores raros como "inapropiado ioctl para el dispositivo" son generalmente el resultado de marcar $! en algún punto que no sea justo después de que falló una llamada al sistema. Si muestra su código, apuesto a que alguien señalará rápidamente su error.
Eureka momento!
He tenido este error antes.
¿Ha invocado el depurador Perl con algo como: -
perl -d yourprog.pl > log.txt
Si es así, ¿qué está pasando? Perl Debug intenta consultar y quizás restablecer el ancho del terminal. Cuando stdout no es un terminal, esto falla con el mensaje IOCTL.
La alternativa sería que su sesión de depuración se cuelgue para siempre porque no vio la solicitud de instrucciones.
Lo más probable es que significa que la apertura no falló .
Cuando Perl abre un archivo, comprueba si el archivo es o no un TTY (para que pueda responder al operador de -T $fh
archivo -T $fh
) al emitir el ioctl TCGETS
contra él. Si el archivo es un archivo normal y no un tty, el ioctl falla y establece errno en ENOTTY
(valor de cadena: " ENOTTY
inapropiado para el dispositivo"). Como dice ysth, ¡la razón más común para ver un valor inesperado en $!
lo está verificando cuando no es válido, es decir, en cualquier lugar que no sea inmediatamente después de que falló un syscall, por lo que probar los códigos de resultado de sus operaciones es de vital importancia.
Si está open
realmente devolvió falso para usted, ¡y encontró ENOTTY
en $!
entonces consideraría esto como un pequeño error (¡dando un valor inútil de $!
) pero también estaría muy curioso sobre cómo sucedió. La salida de código y / o truss sería ingeniosa.
Los "archivos" en los sistemas de tipo * nix son en gran medida un concepto abstracto.
Pueden ser áreas en el disco organizadas por un sistema de archivos, pero también podrían ser una conexión de red, un poco de memoria compartida, la salida del búfer de otro proceso, una pantalla o un teclado.
Para que perl sea realmente útil, refleja este modelo muy de cerca, y no trata los archivos emulando una cinta magnética como lo hacen muchos 4gls.
Por lo tanto, intentó una operación "IOCTL" ''abrir para escritura'' en un identificador de archivo que no permite operaciones de escritura, que es una operación IOCTL inapropiada para ese dispositivo / archivo.
Lo más fácil es colocar una declaración " or die ''Cannot open $myfile''
al final de su apertura y puede elegir su propio mensaje significativo.
Me encontré con este error hoy al tratar de usar el código para eliminar una carpeta / archivos que están viviendo en un cuadro de Windoze 7 que está montado como recurso compartido en un servidor Centos. Obtuve el icotl inapropiado por error del dispositivo y probé todo lo que me vino a la mente. Lea casi todas las publicaciones en la red relacionadas con esto.
Obviamente, el problema se aisló en el compartimiento Windoze montado en el servidor Linux. Miró los permisos de archivo en el cuadro Windoze y observó que los archivos tenían sus permisos establecidos para solo lectura.
Los cambió, volvió al servidor Linux y todo funcionó como se esperaba. Puede que esta no sea la solución para la mayoría, pero con suerte salva a alguien en algún momento.
Probé el siguiente código que parecía funcionar:
if(open(my $FILE, "<File.txt")) {
while(<$FILE>){
print "$_";}
} else {
print "File could not be opened or did not exists/n";
}