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
funcionalidadLOCK_NB
en absoluto en Windows. - Suponiendo que cualquier falla de una llamada
LOCK_NB
alflock
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 trabajoFatal
. 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.