"неуместный ioctl для устройства"

у меня есть скрипт Perl, работающий в окне AIX.

скрипт пытается открыть файл из определенного каталога, и он не может прочитать файл, потому что файл не имеет разрешения на чтение, но я получаю другую ошибку, говоря inappropriate ioctl for device.

разве он не должен сказать что-то вроде no read permissions for file или что-то подобное?

что это inappropriate ioctl for device в смысле сообщение?

как я могу это исправить?

EDIT: это то, что я нашел, когда я сделал 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)

8 ответов


скорее всего это означает, что открыть не плохо.

когда Perl открывает файл, он проверяет, является ли файл TTY (так что он может ответить на -T $fh filetest оператор) путем выдачи TCGETS функции ioctl против него. Если файл является обычным файлом, а не tty, ioctl терпит неудачу и устанавливает errno в ENOTTY (строковое значение: "неподходящий ioctl для устройства"). Как говорит ysth, самая распространенная причина увидеть неожиданное значение в $! проверить его, когда это недопустимо - то есть, нигде другое чем сразу после сбоя syscall, поэтому тестирование кодов результатов ваших операций критически важно.

если open на самом деле вернули false для вас, и вы нашли ENOTTY на $! тогда я бы счел это небольшой ошибкой (давая бесполезное значение $!) но мне также было бы очень любопытно, как это произошло. Код и / или вывод ферменной конструкции будет отличным.


нечетные ошибки, такие как" неподходящий ioctl для устройства", обычно являются результатом проверки $! в какой-то момент, кроме как после сбоя системного вызова. Если вы покажете свой код, держу пари, кто-то быстро укажет на вашу ошибку.


"файлы" в системах типа *nix очень абстрактное понятие.

это могут быть области на диске, организованные файловой системой, но они также могут быть сетевым подключением, битом общей памяти, выходом буфера из другого процесса, экраном или клавиатурой.

чтобы perl был действительно полезен, он очень близко отражает эту модель и не обрабатывает файлы, эмулируя магнитную ленту, как многие 4gls.

поэтому он попробовал операцию "IOCTL" "открыть для записи" на дескрипторе файла, который не позволяет операции записи, которая является неподходящей операцией IOCTL для этого устройства/файла.

самое простое, что нужно сделать, это вставить"or die 'Cannot open $myfile' заявление в конце вы открываете, и вы можете выбрать свое собственное значимое сообщение.


"неподходящий ioctl для устройства" - это строка ошибки для ошибки ENOTTY. Раньше он запускался в основном попытками настроить свойства терминала (например, режим Эха) на файловом дескрипторе, который не был терминалом (но, скажем, обычным файлом), следовательно, ENOTTY. В более общем плане он запускается при выполнении ioctl на устройстве, которое не поддерживает этот ioctl, следовательно, строка ошибки.

чтобы узнать, что делает ioctl, который терпит неудачу, и на каком файловом дескрипторе запустите скрипт под strace / ферменной конструкцией. Вы узнаете ENOTTY, а затем фактическую печать сообщения об ошибке. Затем выясните, какой номер файла был использован, и какой вызов open() вернул этот номер файла.


Эврика!

У меня была эта ошибка раньше.

вы вызывали отладчик perl с чем-то вроде: -

perl -d yourprog.pl > log.txt

Если это так, что происходит, Perl debug пытается запросить и, возможно, сбросить ширину терминала. Когда stdout не является терминалом, это происходит с сообщением IOCTL.

альтернативой было бы, чтобы ваш сеанс отладки зависал навсегда, потому что вы не видели приглашение для инструкций.


Я только что исправил эту ошибку perl. См.https://rt.perl.org/Ticket/Display.html?id=124232

когда мы нажимаем буферный слой на PerlIO и делаем неудачную проверку isatty() который, очевидно, терпит неудачу во всех нормальных файлах, игнорирует неправильный errno ENOTTY.


столкнулся с этой ошибкой сегодня, пытаясь использовать код для удаления папки / файлов, которые живут на Windoze 7 box, который установлен как общий ресурс на сервере Centos. Получил неподходящий icotl для ошибки устройства и попробовал все, что пришло на ум. Читайте почти каждый пост в сети, связанный с этим.

очевидно, что проблема была изолирована от смонтированного ресурса Windoze на сервере Linux. Смотрел в разрешениях файла на Windoze box и отметил, что файлы имеют свои разрешения только для чтения.

изменил их, вернулся на сервер Linux, и все работало так, как ожидалось. Это может быть не решение для большинства, но, надеюсь, это сэкономит кому-то время.


я попробовал следующий код, который, казалось, работает:

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "$_";}
} else {
    print "File could not be opened or did not exists\n";
}