Pregunta

Estoy asumiendo que una vez que un semáforo se crea mediante un proceso, que será accesible por cualquier proceso / usuario.

¿Es posible poner restricciones de acceso en un semáforo en particular para que pueda ser accesible sólo por ciertos procesos / usuarios o solamente ciertos procesos pueden liberar el semáforo.
Veo algunos problemas si hacemos un semáforo accesible por todos processes.Eg: un proceso simulado puede leer el semáforo y liberar el bloqueo en el deseo de hacer una señal falsa al proceso real que realmente está esperando a que el bloqueo de semáforo

.

Todas estas preguntas están surgiendo como que estoy recibiendo de salida muy raro con el siguiente fragmento de código:

use Win32::Semaphore; 

$sem = Win32::Semaphore->new(0, 1,"reliance2692") 
    or print "Can't create semaphore\n";

$sem = Win32::Semaphore->open("reliance2692") 
    or print "Can't open semaphore\n";

print "Semaphore:" . $sem . "\n";

Al ejecutar el programa anterior, que estoy recibiendo el siguiente resultado

Can't create semaphore
Can't open semaphore

El resultado muestra que su no pudo crear un semáforo e incluso no pudieron abrir el semáforo. la creación de un semáforo podría haber fallado si un semáforo ya existe con el nombre dado. No entiendo por qué no abertura de un semáforo.

Puede alguien aclarar el escenario en el que falla tanto de semáforos y la apertura crear el semáforo.

¿Fue útil?

Solución

Win32 :: Semáforo vaina

$semaphore = Win32::Semaphore->new($initial, $maximum, [$name])

  

Constructor para un nuevo objeto de semáforos. $ Inicial es el recuento inicial, y el máximo es de $   la cuenta máxima para el semáforo. Si se omite o no def nombre $, crea un anónimo   objeto semáforo.

     

Si el nombre $ significa un objeto de semáforos, a continuación, $ $ inicial y máxima son ignorados   y se abre el objeto. Si esto sucede, $^E se establecerá en 183   (ERROR_ALREADY_EXISTS).

Si estoy leyendo esto correctamente, si su llamada a Win32::Semaphore->new refiere a un semáforo existente, entonces la llamada new se abrirá el semáforo, así, y la llamada open posterior será redundante (no es claro para mí de la vaina lo que debería ocurrir si abre un sempahore que ya está abierto).

Tal vez usted podría recorrer el código, comprobando el valor de $sem, así como $! y $^E en cada paso.

respuesta adicional: la API de windows tiene métodos para establecer el control de acceso de semáforos, pero

  1. no parecen ser expuesta en el módulo Perl Win32::Semaphore
  2. control de acceso no puede ajustarse a menos que ya fue permitido por el otro proceso que creó el semáforo

No sé si tiene buenas opciones para este problema. Se puede modificar el proceso que crea el semáforo para relajar las restricciones de acceso? Pedir al autor Win32::Semaphore para actualizar su módulo? Tratar de solucionar Win32::Semaphore mismo?

Otros consejos

Win32::Semaphore->new llama a la función API de Windows CreateSemaphore y se pone el proceso de descriptor de seguridad predeterminado , que por lo general significa que los procesos que se ejecutan como el mismo usuario que la secuencia de comandos pueden tener acceso completo mientras que los procesos que se ejecutan como otras cuentas no obtienen acceso. Así que, para empezar, su hipótesis es falsa.

El nombre que elija en el código Perl se pasa directamente a la función de la API, por lo que es objeto de la misma reglas de espacio de nombres como todos los demás objetos del núcleo Win32.

Win32 :: Semáforo ofrece ninguna interfaz para especificar las restricciones de acceso. Incluso si lo hiciera, Windows no proporciona permisos por proceso. Permisos están unidos a la usuario , no el proceso .

Si usted está recibiendo "acceso denegado" de new, entonces eso indica que hay otro programa en ejecución que optó por utilizar el mismo nombre para otra cosa - tal vez otro semáforo de, o tal vez algo más, como un evento o un mutex - y este proceso se ejecuta como un usuario diferente.

Si usted está recibiendo "acceso denegado" de open, a continuación, además de las posibilidades de new, podría ser que otro proceso ya ha abierto un semáforo con el mismo nombre pero no ha otorgado los permisos a otros usuarios. solicitudes Win32::Semaphore->open SEMAPHORE_ALL_ACCESS permiso .

Si el semáforo ya se ha abierto por un proceso que se ejecuta como el mismo usuario, entonces no debería tener "acceso denegado". Ni new ni open deben fallar en ese caso, aunque $^E podría contener 183 (ERROR_ALREADY_EXISTS) de todos modos.

Para que conste, yo soy el autor de Win32 :: Semáforo . Como mobrule y Rob han explicado, la seguridad de Windows es el usuario / grupo con base. No es posible tener un semáforo que sólo ciertos procesos pueden acceder. Si cualquier proceso que pertenece a un usuario puede acceder a un semáforo, a continuación, cualquier proceso de la que el usuario puede acceder a ese semáforo.

Normalmente, el acceso por defecto sólo permite que el usuario actual para acceder al semáforo. Nadie ha solicitado la capacidad de tener Win32 :: Semáforo especifica un descriptor de seguridad no predeterminado, y la API asociado no es trivial. Si alguien ha creado un módulo para gestionar una estructura SECURITY_ATTRIBUTES, estaría feliz de añadir soporte para que a los módulos IPC relacionados Win32 :: semáforo y. Win32-Seguridad no parece ser ese módulo, aunque podría ser un comienzo .

Si necesita un semáforo para trabajar a través de múltiples usuarios, su única solución en este momento es crear el semáforo fuera de Win32 :: semáforo, pasando un puntero SECURITY_ATTRIBUTES apropiado. Se podría hacer eso con un pequeño programa de ayuda escrito en C, o el uso de Inline :: C . (Recuerde que una vez creada, existe un semáforo mientras cualquier proceso tiene un identificador abierto a ella, por lo que su programa de ayuda necesita para mantener el mango del semáforo abierto hasta que ha llamado Win32::Semaphore->open en él.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top