Programación del entorno Linux - solución detallada función ftok ()

  
 

El sistema debe especificar un valor de ID al establecer la comunicación IPC (como la cola de mensajes y la memoria compartida). Usualmente, el valor de id es obtenido por la función ftok. El prototipo de ftok es el siguiente: key_t ftok (char * fname, int id) fname es el nombre del archivo que especifica (el archivo debe estar presente y accesible), id es la subsecuencia, aunque es int, pero solo se usan 8 bits (0-255). Cuando se ejecuta con éxito, se devolverá un valor de key_t, de lo contrario se devuelve -1. En una implementación típica de UNIX, se saca el número de nodo índice del archivo y el subnúmero se agrega al valor de retorno de key_t. Si el número de inodo del archivo especificado es 65538, se convierte a 0x010002 hexadecimal, y el valor de ID que especifica es 38, se convierte a 0x26 hexadecimal, el valor de retorno de key_t final es 0x26010002. archivo de consulta número de inodo de métodos son: ls -i Los siguientes procedimientos de ensayo: # include < stdio.h > # include < sys /types.h > # include < sys /ipc.h > #define IPCKEY 0x11int principal (void) {int i = 0; para (i = 1; i < 256; ++ i) printf (clave =% x \\ n ", ftok (" /tmp ", i)); return 0;}

Después de obtener la clave con éxito, puede usarla como el valor clave de la comunicación entre procesos de un determinado método, como la forma en que shmget comparte memoria.

El prototipo de la función de shmget es

int shmget (key_t, size_t, flag);

Después de que la creación se realiza correctamente, se devuelve el descriptor de la memoria compartida. El key_t utilizado en shmget es la

instancia generada por ftok:

#include < sys /shm.h > #include < stdio.h > #include < errno.h > # include < string.h > # include < stdlib.h >

#define TAMAÑO 1024

extern int errno;

int main () {int shmid; char * shmptr;

//Crear memoria compartida if ((shmid = shmget (IPC_PRIVATE, TAMAÑO, 0600)) < 0) {printf (" error de shmget:% s \\ n " , strerror (errno)); return -1;}

//Conectar la memoria compartida a una dirección disponible

if ((shmptr = (char *) shmat (shmid, 0, 0 )) == (void *) - 1) {printf (" error shmat:% s \\ n ", strerror (errno)); devolver -1;} memcpy (shmptr, " Hello World ", sizeof (" Hola mundo ")); printf (" compartir memoria de% lx a% lx, contenido:% s \\ n ", (sin signo largo) shmptr, (sin signo largo) (shmptr + TAMAÑO), shmptr);

//Eliminar la memoria compartida si ((shmctl (shmid, IPC_RMID, 0) < 0)) {printf (" error de shmctl:% s \\ n ", strerror (errno)); return -1;}} < Br>

multiproceso condiciones de memoria compartida:

# include < sys /shm.h > # include < stdio.h > # include < errno.h > # include < string.h > # include < stdlib. h > # include < unistd.h > # include < sys /types.h > # include < sys /wait.h >

#define TAMAÑO 1024

extern int errno;

int main () {int shmid; char * shmptr; key_t key; pid_t pid;

if ((pid = fork ()) < 0) {printf (" error de fork :% s \\ n ", strerror (errno)); return -1;} else if (pid == 0) {sleep (2); if ((key = ftok (" /dev /null ", 1)) < 0) {printf (" error ftok:% s \\ n ", strerror (errno)); devolver -1;} if ((shmid = shmget (clave, tamaño, 0600)) < 0) {printf ( " error de shmget:% s \\ n ", strerror (errno)); exit (-1);}

if ((shmptr = (char *) shmat (shmid, 0, 0)) == (void *) - 1) {printf (" error shmat:% s \\ n ", strerror (errno)); salida (-1);} //memcpy (shmptr, " Hello World ", sizeof (" Hola mundo ")); printf (" child: pid es% d, comparte memoria desde% lx a% lx, contenido:% s \\ n ", getpid (), (unsigned long) shmptr, (unsigned long) (shmptr + TAMAÑO), shmptr); printf (" proceso hijo sueño 2 segundos \\ n "); sueño (2); if ((shmctl (shmid, IPC_RMID, 0) < 0)) {printf (" error shmctl:% s \\ n ", strerror (errno)); salida (-1);} de salida ( 0);} //padre else {if ((key = ftok (" /dev /null ", 1)) < 0) {printf (" error de ftok:% s \\ n ", strerror (errno)); return -1;} if ((shmid = shmget (key, SIZE, 0600

Copyright © Conocimiento de Windows All Rights Reserved