Paso 4: Crear objetos IPC
Se crea un objeto de memoria compartida con shmget mientras que un semáforo utiliza semget. Ambos necesitan una clave, banderas y un valor de funciones específicas. Para comprobar el estado de objetos IPC que cree, puede introducir uno de los siguientes comandos de Linux para memoria compartida o semáforos, respectivamente:gato /proc/sysvipc/shmgato /proc/sysvipc/sem
Estos comandos son muy útiles cuando usted está tratando de determinar cuando un objeto ha sido creado o destruido. También le permite ver la clave y el identificador del objeto. Esto ayuda a depurar el script en Python ya sabes seguro que son realmente disponibles para Python usar los objetos IPC.
Teclas Todos los objetos IPC se crean utilizando una clave única. Para una prueba sencilla es aceptable usar una clave de cifrado duro pero más allá de eso es útil tener una función de generar claves para usted. SysV proporciona la función ftok para este propósito. Sus argumentos son una cadena (que representa la ubicación de un archivo) y un int (utilizado para generar las claves diferentes). ftok combina la ruta de acceso y el int (aunque sólo los 8 bits menos significativos se utilizan - y debe ser distinto de cero) para generar una clave única (la mayoría del tiempo). Todavía hay la posibilidad de llamar a ftok con diferentes argumentos y tener la misma clave. Otorgado, la posibilidad es pequeña pero una solución robusta debe manejar esta condición. Dicho esto, este proyecto pasa por alto esta condición porque pronto se actualizará para utilizar las funciones POSIX IPC - que siempre se vuelven claves únicas.
Banderas Las banderas a shmget y semget controlan cómo se crea. IPC_CREAT por sí mismo va a crear el objeto si no existe o simplemente devuelve el ID del objeto actual si ya se ha hecho. OR'ing IPC_EXCL con IPC_CREAT hará la función de error si el objeto ya existe. Desde aquí podría negociar una manera de generar una nueva clave y abrir ese objeto en su lugar. Usted puede también o en los permisos de archivo - 0666 o 0660 en este código. Esto representa los permisos para el propietario, grupo y otros para este objeto. El valor 0666 permite los tres a la lectura y escritura mientras 0660 sólo permite que el propietario y el grupo de lectura/escritura.
En este código omite IPC_EXCL sobre todo porque si se olvida de destruir los objetos IPC antes de reprogramar el Galileo, persisten los viejos objetos IPC. Cuando el bosquejo nuevo funciona con IPC_EXCL verá que los objetos IPC ya han sido creados y error. Ahora te deja para destruir los objetos manualmente o reiniciar el Galileo. Dejando IPC_EXCL este problema se evita. También, puesto que los programas solos crear objetos IPC son los que está lanzando no tendrá que preocuparse de chocar con los objetos IPC de otro proceso.
Argumentos adicionales e inicialización En SysV, un objeto de semáforo es realmente un array de semáforos. Por simplicidad, limitaremos cada objeto a un único semáforo. Esto también ayuda a hacer un poco más legible el código. El segundo argumento de semget es el número de semáforos para este objeto.
Un objeto de memoria compartida necesita saber su tamaño antes de la creación. Por lo tanto, el segundo argumento de shmget es el tamaño del segmento de memoria compartida que se creará.
La función shmat fijará el objeto de memoria compartida para el espacio de direcciones del proceso actual (es decir, el bosquejo). Esto es lo que permitirá el bosquejo a leer y escribir desde el segmento de memoria compartida como si fuese un objeto de datos creado por el bosquejo. El puntero void devuelto por shmat debe estar fundido podemos operar sobre él más adelante.
El semáforo debe tener su cuenta inicializado a un valor consistente con su interpretación en el código. Por ejemplo, un semáforo que representa la cantidad de datos es de una cola (inicialmente vacía) debe establecerse en cero después de la creación. Esto se hace con la función semctl que toma ID de semáforo, el índice dentro de la matriz semáforo (siempre 0 para este código), un comando y una Unión. La Unión contiene datos que pueden ser utilizados por ciertos comandos. Aquí solo tenemos el comando SETVAL que establece cuenta del semáforo en el int de la Unión.