windows perl magic-numbers errno

EWOULDBLOCK equivalente errno en Windows Perl



magic-numbers (2)

G''day Stackoverflowers,

Soy el autor del autodie pragma de Perl, que cambia los complementos de Perl para arrojar excepciones cuando falla. Es similar a Fatal , pero con alcance léxico, un modelo de excepción extensible, una comprobación de retorno más inteligente y mensajes de error mucho mejores. Reemplazará el módulo Fatal en futuras versiones de Perl (provisionalmente 5.10.1+), pero actualmente se puede descargar desde el CPAN para Perl 5.8.0 y posteriores.

El próximo lanzamiento de autodie agregará un manejo especial para las llamadas al flock con la LOCK_NB (sin bloqueo). Si bien una llamada de flock fallida normalmente daría lugar a una excepción en autodie , una llamada fallida a una flock utilizando LOCK_NB simplemente devolverá falso si el errno devuelto ( $! ) Es EWOULDBLOCK .

La razón de esto es para que la gente pueda continuar escribiendo código como:

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. }

En el código anterior, un bloqueo que falla porque alguien más ya tiene el archivo bloqueado ( EWOULDBLOCK ) no se considera un error difícil, por lo que el bloqueo automático de la derivación simplemente devuelve un valor falso. En la situación de que estamos trabajando con un sistema de archivos que no admite bloqueos de archivos, o un sistema de archivos de red y la red acaba de fallar, entonces el bloqueo automático genera una excepción apropiada cuando ve que nuestro EWOULDBLOCK no es EWOULDBLOCK .

Esto funciona bien en mi versión dev en sistemas con sabor Unix, pero falla terriblemente en Windows. Parece que mientras Perl en Windows admite la opción LOCK_NB , no define EWOULDBLOCK . En cambio, el errno devuelto es 33 ("Error de dominio") cuando ocurra el bloqueo.

Obviamente puedo codificar esto como una constante en autodie , pero eso no es lo que quiero hacer aquí, porque significa que estoy jodido si el error nunca cambia (o ha cambiado). Me encantaría compararlo con el equivalente de Windows de POSIX::EWOULDBLOCK , pero no puedo por mi vida encontrar dónde se definiría eso. Si puedes ayudar, házmelo saber.

Respuestas específicamente no quiero:

  • Sugerencias para codificarlo como una constante (o peor aún, dejar un número mágico flotando).
  • No es compatible LOCK_NB funcionalidad LOCK_NB en absoluto en Windows.
  • Suponiendo que cualquier falla de una llamada LOCK_NB al flock debería ser simplemente falsa.
  • Sugerencias que pido en p5p o perlmonks . Ya sé sobre ellos.
  • Una explicación de cómo flock , o excepciones, o trabajo Fatal . Ya lo se. Íntimamente.

En Win32 Perl "nativo", tenga en cuenta que $ ^ E es más descriptivo en 33, "El proceso no puede acceder al archivo porque otro proceso bloqueó una parte del archivo" que es ERROR_LOCK_VIOLATION (disponible en Win32 :: WinError ).


Para el código de error específico de Windows, desea usar $^E En este caso, es 33: "El proceso no puede acceder al archivo porque otro proceso ha bloqueado una parte del archivo" ( ERROR_LOCK_VIOLATION en winerror.h ).

Desafortunadamente, no creo que Win32 :: WinError esté en el núcleo. Por otro lado, si Microsoft volviera a numerar los códigos de error de Windows, casi todos los programas de Windows que se hayan escrito dejarán de funcionar, por lo que no creo que haya un problema con la codificación.