Frage

G'day Stackoverflowers,

Ich bin der Autor von Perl autodie Pragma, die Perl eingebauten Ins ändert werfen Ausnahmen ein Fehler auftrat. Es ist ähnlich href="http://search.cpan.org/perldoc?Fatal" rel="nofollow noreferrer"> Fatal , aber mit lexikalischen Gültigkeitsbereich, eine erweiterbare Ausnahme Modell, intelligentere Rückkehr Prüfung an Fatal Modul in zukünftigen Versionen von Perl (vorläufig 5.10.1+) ersetzen, kann aber zur Zeit von der CPAN für Perl 5.8.0 und höher heruntergeladen werden.

Die nächste Version von autodie fügt eine spezielle Behandlung für Anrufe mit der flock (non-blocking) Option LOCK_NB. Während ein gescheiterter flock Anruf normalerweise in einer Ausnahme unter autodie, ein gescheiterter Anruf wird lediglich flock mit LOCK_NB return false ergeben würde, wenn die erhaltene errno ($!) EWOULDBLOCK ist.

Der Grund dafür ist, so können die Menschen auch weiterhin Code wie schreiben:

use Fcntl qw(:flock);

use autodie;   # All perl built-ins now succeed or die.

open(my $fh, '<', 'some_file.txt');

my $lock = flock($fh, LOCK_EX | LOCK_NB);  # Lock the file if we can.

if ($lock) {
    # Opportuntistically do something with the locked file.
}

In dem obigen Code, eine Sperre, die fehlschlägt, weil jemand anderes die Datei bereits gesperrt hat (EWOULDBLOCK) gilt als nicht schwer Fehler sein, so autodying flock nur gibt einen falschen Wert. In der Situation, die wir mit einem Dateisystem arbeiten, die nicht Datei-Sperren nicht unterstützt, oder einem Netzwerk-Dateisystem und das Netzwerk gerade gestorben ist, dann erzeugt autodying flock eine entsprechende Ausnahme, wenn es sieht, dass unser errno nicht ist EWOULDBLOCK.

Dies funktioniert gut in meiner Dev-Version auf Unix-Systemen aromatisieren, aber es funktioniert nicht schrecklich unter Windows. Es scheint, dass während Perl unter Windows die LOCK_NB Option unterstützt, ist es nicht EWOULDBLOCK definieren. Stattdessen kehrte die errno ist 33 ( "Domain-Fehler"), wenn auftreten würde blockieren.

Natürlich kann ich schwer Code dies als eine Konstante in autodie, aber das ist nicht das, was ich hier tun will, weil es bedeutet, dass ich geschraubt werde, wenn die errno jemals ändert (oder geändert hat). Ich würde gerne in die Windows-Äquivalent von POSIX::EWOULDBLOCK zu vergleichen, aber ich kann nicht für das Leben von mir finden, wo eine solche Sache definiert werden würde. Wenn Sie helfen können, lassen Sie es mich wissen.

Antworten ich ausdrücklich nicht wollen:

  • Vorschläge zu hart Code als eine Konstante (oder schlimmer noch, eine magische Zahl schwimmend verlassen).
  • Nicht LOCK_NB Funktionalität auf alle unter Windows unterstützt.
  • Unter der Annahme, dass ein Ausfall von einem LOCK_NB Aufruf flock sollte lediglich false zurück.
  • Vorschläge, die ich auf P5P fragen oder PerlMonks . Ich weiß schon über sie.
  • Eine Erklärung, wie flock oder Ausnahmen oder Fatal Arbeit. Ich weiß schon. Innig.
War es hilfreich?

Lösung

Unter Win32 „native“ Perl, beachten Sie, dass $ ^ E 33 mehr beschreibend, „Der Prozess kann nicht die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt“, die ERROR_LOCK_VIOLATION (erhältlich von Win32 :: WinError )

Andere Tipps

Für den Windows-spezifischen Fehlercode, mögen Sie $^E verwenden. In diesem Fall ist es 33: „Der Prozess kann nicht die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt hat“ (ERROR_LOCK_VIOLATION in winerror.h)

.

Leider glaube ich nicht Win32 :: WinError in Kern . Auf der anderen Seite, wenn Microsoft jemals die Windows-Fehlercodes neu nummeriert, so ziemlich jedes Windows-Programm, das jemals aufhören würde geschrieben arbeiten, so glaube ich nicht, es werde ein Problem mit hartzucodieren es sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top