web-dev-qa-db-fra.com

"ioctl inapproprié pour le périphérique"

J'ai un script Perl s'exécutant dans une zone AIX. 

Le script tente d'ouvrir un fichier à partir d'un certain répertoire et ne parvient pas à lire le fichier car le fichier n'a pas de permission de lecture, mais j'obtiens une erreur différente en disant inappropriate ioctl for device

Ne devrait-il pas dire quelque chose comme no read permissions for file ou quelque chose de similaire?

Que signifie ce message inappropriate ioctl for device?

Comment puis-je le réparer?

EDIT: C’est ce que j’ai trouvé lorsque j’ai fait 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 ou TCGETS, 0xbffc14f8) = -1 ENOTTY 
 (Ioctl inapproprié pour le périphérique) 
47
someguy

Cela signifie très probablement que l'ouverture n'a pas échoué .

Lorsque Perl ouvre un fichier, il vérifie s'il est ou non un TTY (afin de pouvoir répondre à l'opérateur -T $fh filetest) en émettant l'ioctl TCGETS. Si le fichier est un fichier standard et non un tty, l'ioctl échoue et définit errno sur ENOTTY (valeur de chaîne: "ioctl inapproprié pour le périphérique"). Comme indiqué par ysth, la raison la plus courante de voir une valeur inattendue dans $! est de la vérifier lorsqu'elle n'est pas valide - c'est-à-dire n'importe où autre que juste après l'échec d'un appel système. Il est donc essentiel de tester les codes de résultat de vos opérations important.

Si open vous a effectivement renvoyé false, et que vous avez trouvé ENOTTY dans $!, je considérerais cela comme un petit bug (donnant une valeur inutile de $!), mais je serais aussi très curieux de savoir comment cela s'est passé. La sortie de code et/ou de structure serait astucieuse.

35
hobbs

Les erreurs étranges telles que "ioctl inapproprié pour device" résultent généralement de la vérification de $! à un moment autre que juste après l'échec d'un appel système. Si vous montriez votre code, je parie que quelqu'un signalerait rapidement votre erreur.

19
ysth

"fichiers" dans les systèmes de types * nix sont un concept abstrait.

Il peut s’agir de zones sur disque organisées par un système de fichiers, mais il peut également s'agir d’une connexion réseau, d’un peu de mémoire partagée, de la mémoire tampon produite par un autre processus, d’un écran ou d’un clavier.

Pour que Perl soit vraiment utile, il reflète ce modèle de très près et ne traite pas les fichiers en émulant une bande magnétique, contrairement à beaucoup de lecteurs.

Donc, il a essayé une opération "IOCTL" "open for write" sur un descripteur de fichier qui ne permet pas les opérations d'écriture, ce qui est une opération IOCTL inappropriée pour ce périphérique/fichier.

La chose la plus simple à faire est de coller une "instruction or die 'Cannot open $myfile' à la fin de l’ouverture et de choisir votre propre message significatif.

5
James Anderson

"ioctl inapproprié pour le périphérique" est la chaîne d'erreur pour l'erreur ENOTTY. Auparavant, il était principalement déclenché par des tentatives de configuration des propriétés du terminal (par exemple, le mode echo) sur un descripteur de fichier qui n'était pas un terminal (mais, par exemple, un fichier normal), d'où ENOTTY. Plus généralement, il est déclenché lors de l'exécution d'un ioctl sur un périphérique qui ne prend pas en charge cet ioctl, d'où la chaîne d'erreur.

Pour savoir quel ioctl est fabriqué qui échoue et sur quel descripteur de fichier, exécutez le script sous strace/truss. Vous reconnaîtrez ENOTTY, suivi de l'impression réelle du message d'erreur. Recherchez ensuite quel numéro de fichier a été utilisé et quel appel open () a renvoyé ce numéro de fichier.

4
Martin v. Löwis

Moment Eurêka!

J'ai eu cette erreur auparavant. 

Avez-vous appelé le débogueur Perl avec quelque chose comme: -

Perl -d yourprog.pl > log.txt

Si tel est le cas, Perl debug tente d'interroger et éventuellement de réinitialiser la largeur du terminal . Lorsque stdout n'est pas un terminal, cela échoue avec le message IOCTL.

L'alternative serait que votre session de débogage soit suspendue pour toujours car vous n'avez pas vu l'invite pour obtenir des instructions.

2
James Anderson

Je viens de corriger ce bogue Perl ... Voir https://rt.Perl.org/Ticket/Display.html?id=124232

Lorsque nous transmettons la couche tampon à PerlIO et effectuons une vérification isatty () Qui échoue de manière évidente sur tous les fichiers normaux, ignorez le code erroné ENOTTY.

2
rurban

Nous sommes tombés sur cette erreur aujourd'hui en essayant d'utiliser du code pour supprimer un dossier/des fichiers hébergés sur une boîte Windoze 7 montée en tant que partage sur un serveur Centos. Vous avez l'icotl inapproprié pour l'erreur de périphérique et essayez tout ce qui vous passe par la tête. Lisez à peu près tous les posts sur le net qui y sont associés.

De toute évidence, le problème était isolé du partage Windoze monté sur le serveur Linux. Lookedat les autorisations de fichier sur la boîte de dialogue Windoze et a noté que les autorisations de fichiers étaient définies en lecture seule.

Changé ceux-ci, est retourné sur le serveur Linux et tout a fonctionné comme prévu. Ce n'est peut-être pas la solution pour la plupart des gens, mais j'espère que cela fera gagner du temps à quelqu'un.

0

J'ai essayé le code suivant qui semblait fonctionner:

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