Подтвердить что ты не робот

"несоответствующий ioctl для устройства"

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

script пытается открыть файл из определенного каталога, и он не может прочитать файл, потому что файл не имеет разрешения на чтение, но я получаю другую ошибку, говорящую 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)
4b9b3361

Ответ 1

Скорее всего, это означает, что open не сработал.

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

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

Ответ 2

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

Ответ 3

"files" в системах * nix типа - очень абстрактное понятие.

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

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

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

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

Ответ 4

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

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

Ответ 5

Эврика момент!

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

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

perl -d yourprog.pl > log.txt

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Так как это фатальная ошибка и ее также сложно отладить, может быть, исправление можно было бы поместить куда-нибудь (в предоставленной командной строке?):

export GPG_TTY=$(tty)

От: https://github.com/keybase/keybase-issues/issues/2798