Cómo utilizar *** para disfrutar de la memoria para implementar la comunicación entre procesos en lenguaje C
(1) int shmget (key_t key, int size, int shmflg), abre o usa una sección de la memoria disfrutada .
(2) void *shmat(int shmid, const void *shmaddr, int shmflg), conecta la memoria que disfruta **** señalada por el parámetro shmid al proceso actual.
Cuando utilices una determinada memoria oculta, primero debes utilizar shmat para establecer una conexión.
(3) int shmdt(const void *shmaddr), desvincula la memoria disfrutada anteriormente conectada con shmat del proceso actual. El parámetro shmaddr es la dirección de memoria de cobertura devuelta por shmat.
Una vez que hayas terminado de usar la memoria disfrutada, debes usar shmdt para desvincularla.
(4) int shmctl(int shmid, int cmd, struct shmid_ds *buf), utilizado para controlar las operaciones de memoria. Cuando cmd es IPC_RMID, elimine la *** memoria compartida a la que hace referencia shmid.
Los archivos de encabezado de estas funciones son
El siguiente es un proceso que utiliza memoria hexadecimal. Ejemplos de intercomunicación: el proceso A abre una nueva memoria maldita, el proceso B modifica la memoria maldita, el proceso C imprime el contenido de la memoria maldita y el proceso D Elimina la memoria maldita maldita.
El proceso BCD ejecuta un comando en el siguiente formato: el comando *** usa el ID de la memoria, por ejemplo ./output 123432.
El código del proceso A es el siguiente:
int main()
{
int shmid;
shmid = shmget(IPC_PRIVATE, TAMAÑO, IPC_CREAT | 0600);
if (shmid < 0)
{
error("error de shmget") ;
p>exit(1);
}
printf("crear memoria compartida OK.shmid=%d/n", shmid);
p>return 0;
}
El código del proceso B es el siguiente:
int main(int argc, char *argv[]) p>
{
int shmid;
char *shmaddr;
if (argc != 2)
{
perror("error argc/n");
salir(1);
}
shmid = atoi(argv[1 ]);
shmaddr = (char *)shmat(shmid, NULL, 0 );
if ((int )shmaddr == -1 )
{
error("shmat error./n");
salir(1);
}
strcpy(shmaddr, "¡hola, mundo!");<
shmdt(shmaddr);
return 0;
}
El código del programa C es el siguiente:
int main(int argc, char *argv[])
{
int shmid; p>
char * shmaddr;
if (argc != 2)
{
printf("argc error/n"); p>
salir(1);
}
shmid = atoi(argv[1]);
shmaddr = (char *)shmat( shmid, NULL, 0 );
if ((int )shmaddr == -1)
{
perror("shmat error./n") ;
salir( 1);
}
printf("%s/n", shmaddr);
shmdt(shmaddr );
return 0;
}
El código del proceso D es el siguiente:
int main(int argc, char *argv[])
{
int shmid;
if (argc ! = 2)
{
error("argc error/n");
salir(1);
} p>
shmid = atoi(argv[1]);
shmctl(shmid, IPC_RMID, NULL);
devuelve 0;
}