Frage

Ich habe ein Perl-script läuft in einem AIX-box.

Das Skript versucht, eine Datei zu öffnen, die aus einem bestimmten Verzeichnis und nicht die Datei zu Lesen, da die Datei keine Leseberechtigung hat, aber ich bekomme eine andere Fehlermeldung besagt, dass inappropriate ioctl for device.

Sollte es nicht sagen, so etwas wie no read permissions for file oder etwas ähnliches?

Was bedeutet das inappropriate ioctl for device Nachricht bedeuten?

Wie kann ich es beheben?

EDIT:Dies ist, was ich gefunden als ich das Tat 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)
War es hilfreich?

Lösung

Wahrscheinlich bedeutet dies, dass die offene versäumte nicht .

Wenn Perl eine Datei öffnet, überprüft er, ob die Datei ein TTY ist (so, dass es die -T $fh Filetest Betreiber beantworten kann), indem die TCGETS ioctl dagegen Ausgabe. Wenn die Datei eine reguläre Datei und kein tty ist, schlägt die ioctl und setzt errno auf ENOTTY (String-Wert: „Unangemessen ioctl für device“). Wie ysth sagt, ist der häufigste Grund für das Sehen einen unerwarteten Wert in $! es überprüft, wenn es nicht gültig ist - das heißt, überall andere als unmittelbar nach einem syscall ausgefallen ist, testet so die Ergebniscodes Ihrer Operationen ist von entscheidender Bedeutung.

Wenn open tat tatsächlich falsch Rückkehr für Sie, und Sie fanden ENOTTY in $! dann würde ich diesen einen kleinen Fehler betrachtet (einen nutzlosen Wert von $! geben), aber ich würde auch sehr gespannt sein, wie es passiert ist. Code und / oder Truss Ausgang wäre geschickt.

Andere Tipps

Odd Fehler wie „unangemessene ioctl für device“ ist in der Regel ein Ergebnis von $ Kontrolle! irgendwann andere als nur nach einem Systemaufruf ist fehlgeschlagen. Wenn Sie Ihren Code zeigen würde, ich wette, jemand schnell Ihre Fehler hinweisen würde.

"Dateien" in * nix-Typ-Systeme sind sehr viel ein abstrakter Begriff.

Sie können Bereiche auf der Festplatte durch ein Dateisystem organisiert sein, aber sie könnte genauso gut eine Netzwerkverbindung, ein bisschen gemeinsam genutzten Speicher, der Pufferausgang von einem anderen Prozess, ein Bildschirm oder eine Tastatur sein.

Um für Perl wirklich nützlich sein, um es dieses Modell spiegelt sehr eng, und behandelt Dateien nicht durch einen Magnetband so viele 4GLs tun emuliert wird.

So ist es versuchte, einen „IOCTL“ Betrieb ‚offen für write‘ auf einer Datei-Handelte, die keine Schreibvorgänge erlauben das ist ein ungeeigneter IOCTL Betrieb für das Gerät / Datei.

Die einfachste Sache zu tun ist, hält eine "or die 'Cannot open $myfile' Aussage am Ende von Ihnen geöffnet und Sie können Ihre eigene aussagekräftige Nachricht wählen.

"unangemessene ioctl für Gerät" ist die Fehler-Zeichenfolge für den ENOTTY Fehler.Es verwendet zu werden triggerred in Erster Linie durch versuche zu konfigurieren-terminal-Eigenschaften (z.B.echo-Modus) auf einem Dateideskriptor das war kein Endgerät (aber, sagen wir, eine normale Datei), damit ENOTTY.Mehr in der Regel, es wird ausgelöst, wenn eine ioctl-Aufruf auf einem Gerät, das nicht Unterstützung, ioctl, daher der Fehler-string.

Finden Sie heraus, was ioctl gemacht werden, die fehlschlägt, und auf welche Datei-Deskriptor, führen Sie das Skript unter strace/truss.Sie werden erkennen, ENOTTY, gefolgt von der eigentlichen Ausgabe der Fehlermeldung.Dann finden Sie heraus, welche Datei die Nummer, verwendet wurde, und, was die open () - Aufruf zurückgegeben wird, dass die Datei mit der Nummer.

Ich habe gerade diesen Perl-Fehler behoben. Siehe https://rt.perl.org/Ticket/Display.html?id= 124232

Wenn wir drücken Sie die Pufferschicht zu PerlIO und tun Überprüfung ein Versagen isatty () was offensichtlich auf allen normalen Dateien fehlschlägt, ignoriert die falsche errno ENOTTY.

Eureka Moment!

ich diesen Fehler haben zuvor.

Haben Sie rufen die Perl-Debugger mit so etwas wie: -

perl -d yourprog.pl > log.txt

Wenn ja, was los ist perl Debug versucht vielleicht abzufragen und die Anschlussbreite zurückgesetzt. Wenn stdout kein Terminal ist dies mit der IOCTL Nachricht fehlschlägt.

Die Alternative wäre für Ihre Debug-Sitzung für immer hängen, weil Sie nicht die Eingabeaufforderung für Befehle gesehen haben.

Da dies ein schwerwiegender Fehler ist und auch sehr schwer zu debuggen, vielleicht das Update setzt irgendwo werden kann (in der mitgelieferten Kommandozeile?):

export GPG_TTY=$(tty)

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

Ran heute in diesen Fehler bei dem Versuch, den Code zu verwenden, um einen Ordner / Dateien zu löschen, die auf einem Windoof 7 Box leben, die als Anteil an einem Centos Server angebracht sind. Haben Sie die unangemessenen icotl für Gerätefehler und versucht, alles, was in den Sinn kam. Lesen Sie nur über jeden Beitrag auf dem Netz im Zusammenhang mit dieser.

Offensichtlich wurde das Problem auf die montierte Windoof-Freigabe auf dem Linux-Server getrennt. Sah bei den Dateiberechtigungen auf der Windoof-Box und stellte fest, die Dateien hatten ihre Berechtigungen nur lesen gesetzt.

Changed diejenigen, ging zurück auf den Linux-Server und alle arbeitete wie erwartet. Dies kann nicht die Lösung für die meisten sein, aber hoffentlich erspart es jemand einige Zeit dauern.

Ich habe versucht, den folgenden Code, der schien zu funktionieren:

if(open(my $FILE, "<File.txt")) {
    while(<$FILE>){
    print "$_";}
} else {
    print "File could not be opened or did not exists\n";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top