Pergunta

Eu tenho um script Perl rodando em uma caixa AIX.

As tentativas de script para abrir um arquivo de um determinado diretório e ele não consegue ler o arquivo porque o arquivo não tem permissão de leitura, mas eu recebo um erro diferente dizendo inappropriate ioctl for device.

que não deveria dizer algo como no read permissions for file ou algo semelhante?

O que isso significa mensagem inappropriate ioctl for device?

Como posso corrigi-lo?

EDIT:. Isto é o que eu encontrei quando eu fiz 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)
Foi útil?

Solução

Provavelmente isso significa que a aberto não falhou .

Quando Perl abre um arquivo, ele verifica se o arquivo é um TTY (de modo que possa responder o operador -T $fh FileTest), emitindo o ioctl TCGETS contra ela. Se o arquivo é um arquivo comum e não um tty, o ioctl falha e conjuntos errno para ENOTTY (valor string: "ioctl impróprio para o dispositivo"). Como ysth diz, a razão mais comum para ver um valor inesperado no $! está verificando-lo quando não é válido - ou seja, em qualquer lugar outros do que imediatamente após uma syscall falhou, então testar os códigos de resultado da sua operações é extremamente importante.

Se open realmente fez return false para você, e você encontrou ENOTTY em $! então eu consideraria isso um pequeno bug (dando um valor inútil de $!), mas eu também seria muito curioso para saber como isso aconteceu. Código e / ou saída de treliça seria bacana.

Outras dicas

erros estranhas como "ioctl impróprio para o dispositivo" são geralmente resultado de verificação $! em algum momento que não seja apenas após uma chamada de sistema falhou. Se você mostrar o seu código, eu aposto que alguém iria rapidamente apontar o seu erro.

"arquivos" em sistemas do tipo * nix são muito um conceito abstrato.

Eles podem ser áreas no disco organizado por um sistema de arquivos, mas eles poderiam muito bem ser uma conexão de rede, um pouco de memória compartilhada, a saída do buffer de outro processo, uma tela ou um teclado.

Para perl para ser realmente útil, espelhos este modelo de muito perto, e não faz arquivos tratar emulando uma fita magnética como muitos 4GLs fazer.

Por isso, tentou uma operação "IOCTL" 'aberto para escrever' em um identificador de arquivo que não permite operações de escrita que é um IOCTL operação inapropriada para esse dispositivo / arquivo.

A melhor coisa a fazer é colocar uma "declaração or die 'Cannot open $myfile' no fim de abrir e você pode escolher sua própria mensagem significativa.

"ioctl impróprio para o dispositivo" é a seqüência de erro para o erro ENOTTY. É usado para ser triggerred principalmente por tentativas para configurar propriedades do terminal (modo por exemplo eco) em um descritor de arquivo que havia terminal (mas, digamos, um arquivo regular), daí ENOTTY. De modo mais geral, ele é acionado ao fazer um ioctl em um dispositivo que não suporta essa ioctl, daí a string de erro.

Para descobrir o que ioctl está sendo feita que não, e em que descritor de arquivo, execute o script sob strace / treliça. Você vai reconhecer ENOTTY, seguido pela impressão real da mensagem de erro. Em seguida, descobrir qual o número de arquivos foi usado, eo que chamada open () retornou que o número de arquivos.

Eu apenas fixo este bug perl. Consulte https://rt.perl.org/Ticket/Display.html?id= 124232

Quando se empurrar a camada de tampão para Perlío e fazer uma isatty falhando () verificação que, obviamente, não em todos os arquivos normais, ignorar o ENOTTY errno errado.

Eureka momento!

Eu tive esse erro antes.

Será que você invocar o depurador perl com algo como: -

perl -d yourprog.pl > log.txt

Se assim o que está acontecendo é tentativas de depuração perl para consulta e talvez redefinir a largura terminal. Quando stdout não é um terminal esta falha com a mensagem IOCTL.

A alternativa seria para o seu sessão de depuração para pendurar para sempre, porque você não vê o prompt para obter instruções.

Uma vez que este é um erro fatal e também muito difícil de depurar, em algum lugar, talvez a correção poderia ser colocado (na linha de comando fornecido?):

export GPG_TTY=$(tty)

De: https://github.com/keybase/keybase-issues/issues / 2798

corri para este erro hoje ao tentar usar o código para excluir uma pasta / arquivos que estão vivendo em uma caixa Windoze 7 que é montado como um compartilhamento em um servidor Centos. Tem o icotl inapropriado para erro de dispositivo e tentou tudo o que me veio à mente. Leia apenas sobre cada post na rede relacionado a isso.

Obviamente, o problema foi isolado para o Windoze share montado no servidor Linux. olhou nas permissões de arquivo na caixa de Windoze e anotados os arquivos tiveram suas permissões definidas para somente leitura.

Mudou aqueles, voltou para o servidor Linux e tudo funcionou como esperado. Isto pode não ser a solução para a maioria, mas espero que ele salva alguém de algum tempo.

Eu tentei o seguinte código que parecia trabalho:

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "$_";}
} else {
    print "File could not be opened or did not exists\n";
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top