2012-08-27 10 views
6

Estoy usando shmget para compartir datos entre los procesos de mi proyecto en Linux.Valores seguros para usar como clave en shmget

int shmget(key_t key, size_t size, int shmflg); 

Sin embargo, ningún otro programa puede llamar a shmget también, y por lo tanto, pueden conducir a un conflicto clave (porque uso una constante como la tecla para llamar shmget, que deben utilizar una constante en lugar de una clave generada debido los procesos laterales se construyen y ejecutan por separado).

¿Cuáles deberían ser los valores seguros que se utilizarán como clave en shmget?

Respuesta

5

le sugiero que utilice el POSIX shm_open (con mmap) En su lugar, no tiene el problema de las colisiones que existe con ftok siempre y cuando usted no está usando la misma región nombrado como otro software.

6

No hay valores seguros, y usted (y cualquier otro proceso que crea segmento compartido) debe usar IPC_EXCL para asegurarse de que no haya colisión. Sin embargo, este último debería asegurarse de que otros programas no comiencen a escribir en su segmento (a menos que estén mal escritos).

Puede intentar construir su constante de clave 'privada' en ftok() pero bueno, usted sabe que no es seguro. Si colisionas con algo, no tendrás una forma de decirle a tus programas que esta no es la clave correcta. También recuerde que:

Solo los 8 bits de bajo orden de id son significativos. El comportamiento de ftok() no se especifica si estos bits son 0.

En otras palabras, no pase 0 allí;).

En cualquier caso, debe seriamente considerar crear algún canal de comunicación. Un único archivo escrito por el servidor con id sería suficiente, que luego sería leído por otros programas.

Desde otras ideas, puede intentar pasar el servidor PID como id, si otros procesos pueden obtener al menos eso. Esto podría hacerlo un poco 'más seguro'.

+0

Estoy pensando en generar claves aleatorias, y repito creando un segmento shm con el indicador IPC_EXCL hasta que encuentre una clave aceptable, pero no sé si es una buena opción – jondinham

+1

@PaulDinh: sí, es una buena opción. Bueno, pero tienes que tener una forma de generar claves aleatorias, sin depender de 'sizeof (key_t)' específico; Solo usaría 'id' aleatorio para ftok() entonces. –

+0

En caso de que tenga un escenario de cliente-servidor en el que cada cliente mantenga un segmento de memoria compartida para un IPC eficiente con el servidor, una buena opción para las teclas exclusivas 'shmget()' es basarlos en la llamada al sistema 'gettid()' , que devuelve la identificación del hilo de la persona que llama. Sin embargo, esto es específico de Linux. –

Cuestiones relacionadas