Вопрос

У меня есть Perl-скрипт, запущенный в окне AIX.

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

Решение

Скорее всего, это означает, что открытое не удалось .

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

perl -d yourprog.pl > log.txt

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

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

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

export GPG_TTY=$(tty)

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

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

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

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

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

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "

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

<*>";} } else { print "File could not be opened or did not exists\n"; }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top