Paso 5: Las funciones de abrir/cerrar
Abierto En el método abierto, cuatro llaves se crean utilizando archivos diferentes y el ID especificado (debe ser distinto de cero) cuando se creó esta instancia de IPCBuffer. Sólo esto permite 255 objetos IPCBuffer a estar en uso a la vez.
El buffer utilizado para mantener los datos entre el Python y bosquejo de procesos es definido por su anchura y longitud. Ancho es el número de bytes que conforman una sola unidad de datos. Por ejemplo, AES cifra los datos en bloques de 16 bytes por lo que el ancho sería 16. En este caso no tiene sentido para permitir un proceso leer más o menos de 16 bytes en un momento dado que los datos serían incompletos. Más adelante veremos por qué no se permite un proceso para leer o escribir el valor de más de un ancho de datos a la vez.
La longitud del buffer es el número de unidades de datos puede almacenar. Así que si el buffer puede mantener a 5 cuadras AES, su longitud sería de 5 y su tamaño total en bytes sería (16 bytes) * 5 = 80 bytes. Un proceso saber donde debe leer o escribir a continuación en el buffer, necesitamos un índice de cabeza y cola. Datos es escritos en el búfer en la cabeza y leer de la cola. Estos cuatro pedazos de datos deben colocarse en el inicio del segmento de memoria compartida. De lo contrario el script de Python no sabría cómo es grande el buffer es o donde debe leer o escribir datos. La imagen de arriba ilustra cómo un segmento de memoria compartida sería establecido para un ancho de 2 y longitud de 4.
El semáforo que representa el espacio libre en el buffer se inicializa a 'length' y el semáforo para la cantidad de datos válido es en el búfer se establece en 0. Un tercer semáforo, sem_lock, se establece en 1 para que sólo nos permiten un solo proceso leer o escribir desde el segmento de memoria compartida a la vez. Sin esta cerradura el código no sería seguro con múltiples lectores y escritores.
Estrecha El método close simplemente destruye los objetos IPC actuales. shmdt Desasocia el segmento de memoria compartida y shmctl (que tiene argumentos similares a semctl) marca el segmento que desea eliminar. Cuando se unen no hay más procesos podría eliminarse. En este punto su clave aparecerá como 0 en /proc/sysvipc/shm cat. Después de llamar a semctl para eliminar los semáforos que se eliminarán inmediatamente y gato /proc/sysvipc/sem ya no les mostrará