Cómo proteger la memoria compartida entre procesos en Linux

En Linux u otro sistema operativo moderno, la memoria de cada proceso está protegida, de modo que una escritura salvaje en un proceso no bloquee ningún otro proceso. Ahora suponga que tenemos memoria compartida entre el proceso A y el proceso B. Ahora digamos, debido a un error leve, el proceso A escribe algo involuntariamente en esa área de memoria. ¿Hay alguna forma de proteger esto, dado que tanto el proceso A como el proceso B tienen acceso de escritura completo a esa memoria?

preguntado el 27 de agosto de 11 a las 19:08

2 Respuestas

Cuando usted llama shm_open puedes pasarlo el O_RDONLY bandera al parámetro de modo.

Alternativamente puedes usar mprotect para marcar páginas específicas como (por ejemplo) de solo lectura. Necesitará cooperación y confianza entre los dos procesos para hacer esto, no hay forma de que B diga que A no puede escribir en él usando mprotect.

Si realmente quiere estar seguro de que el otro proceso no puede interferir, entonces comunicarse a través de tuberías o enchufes de alguna descripción podría ser una idea sensata.

También podrías usar mmap para mapear algo (por ejemplo, en /dev/shm?) los permisos de archivo hacen imposible escribir en uno de los dos procesos si se ejecutan como UID separados. Por ejemplo, si tienes /dev/shm/myprocess propiedad del productor del usuario y del consumidor del grupo y establezca los permisos del archivo en 0640 antes de asignarlo mediante un proceso que se ejecuta con ese UID y GID, entonces podría evitar que el segundo proceso escriba en él.

Respondido 27 ago 11, 23:08

Sé sobre mprotect, pero como dije, ambos tienen acceso completo de lectura y escritura. Me parece imposible lograr esto y creo que la confiabilidad es uno de los principales problemas de los sistemas de memoria compartida. ¿no es así? - Sacerdote Metálico

@MetallicPriest actualizado para agregar el O_RDONLY bandera para la convocatoria abierta. Sin embargo, también hay otras soluciones para esto. Lo actualizaré de nuevo en breve. - Flexo ♦

Gracias awoodland. Una solución que me viene a la mente es usar un mutex para cada acceso a la memoria compartida y dar acceso de escritura al proceso solo cuando haya bloqueado el mutex. Eso reducirá las posibilidades de escrituras salvajes. Sin embargo, creo que este esquema sería muy ineficiente cuando la frecuencia de acceso a la memoria compartida es alta. - Sacerdote Metálico

@MetallicPriest, si tiene punteros perdidos, el mutex en sí puede estar dañado ... - bdonlan

Cambiar permisos directamente en "archivos" en /dev/shm no es portátil. En su lugar, debe especificar el modo deseado (permisos) al crear el objeto de memoria compartida con shm_open y O_CREAT. Alternativamente, simplemente use un archivo en el sistema de archivos normal en lugar de shm_open para obtener memoria compartida. - R .. GitHub DEJA DE AYUDAR A ICE

Puede utilizar una suma de comprobación simple en cada escritura. Por lo tanto, cuando un proceso detecta una suma de comprobación incorrecta en una operación de lectura, es una señal de la falla del otro proceso.

Respondido 27 ago 11, 23:08

Puede usar una suma de verificación, pero considere usar un semáforo también porque la suma de verificación por sí sola será una solución horrible sin alguna forma de sincronización. Pero la mejor solución para la que realmente quiere estar seguro es tener un solo maestro que escriba y lea esa memoria y se comunique con ella a través de un socket para que pueda validar cada escritura. - Martin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.