Hay muchos métodos de comunicación, suponiendo que sea bajo un sistema Linux.
1. Canalizaciones y canalizaciones con nombre:
Las canalizaciones se pueden utilizar para la comunicación entre procesos relacionados. Además de la funcionalidad de las tuberías, las tuberías conocidas también permiten la comunicación entre procesos no relacionados.
2. Señal:
La señal es una simulación del mecanismo de interrupción a nivel de software. Este es un patrón de comunicación complejo que se utiliza para notificar a un proceso que ha ocurrido un evento. El efecto del proceso que recibe la señal es el mismo que el del procesador que recibe la solicitud de interrupción.
3. Cola de mensajes:
La cola de mensajes es una lista vinculada de mensajes, que supera las deficiencias de los semáforos limitados en los dos métodos de comunicación anteriores. Un proceso con permisos de escritura puede enviar. mensajes a la cola de mensajes de acuerdo con ciertas reglas. La cola de mensajes agrega nueva información; los procesos con permisos de lectura en la cola de mensajes pueden leer información de la cola de mensajes.
La tecnología de comunicación de búfer de mensajes fue propuesta por primera vez por Hansen. Su idea básica es utilizar el búfer de mensajes público en la memoria para intercambiar información entre procesos de acuerdo con el principio de "productor-consumidor".
Abre varios buffers de mensajes en la memoria para almacenar mensajes. Siempre que un proceso envía un mensaje a otro proceso, solicitará un búfer de mensajes, enviará el mensaje preparado al búfer, luego insertará el búfer de mensajes en la cola de mensajes del proceso receptor y finalmente notificará al proceso receptor. Después de recibir la notificación del kilometraje de envío, el proceso de recepción toma un búfer de mensajes de la cola de mensajes de este proceso, extrae la información requerida y luego entrega el búfer de mensajes al sistema de vez en cuando.
Un proceso puede enviar mensajes a varios procesos y, a la inversa, un proceso puede recibir mensajes de diferentes procesos. Claramente, la operación de las colas de mensajes en proceso es un área clave. Cuando un proceso de envío agrega un mensaje a la cola de mensajes de un proceso de recepción, el proceso de recepción no puede recibir y enviar mensajes simultáneamente desde la cola de mensajes, o viceversa.
El mecanismo de comunicación del búfer de mensajes incluye lo siguiente:
(1) Búfer de mensajes, que es una estructura de datos compuesta por los siguientes elementos:
1, Mensaje longitud
2. Texto del mensaje
3. Transmisor
4. Puntero de la cola de mensajes
(2) Encabezado de la cola de mensajes Los punteros m-q son generalmente almacenado en la PCB.
(1) El semáforo de exclusión mutua M, con un valor inicial de 1, se utiliza para el acceso mutuo exclusivo a la cola de mensajes y se configura en la PCB.
(2) El semáforo de sincronización m-syn, con un valor inicial de 0, se utiliza para el recuento de mensajes y se configura en la PCB.
(3) Enviar mensaje primitivo enviar
(4) Recibir mensaje primitivo recibir (a)
4.***Memoria compartida:
p>Se puede decir que este es el método más útil de comunicación entre procesos. Permite que múltiples procesos accedan al mismo espacio de memoria, y diferentes procesos pueden ver las actualizaciones de otros procesos a los datos en la memoria a tiempo. Este método se basa en algunas operaciones de sincronización, como exclusión mutua y semáforos.
Este método de comunicación necesita resolver dos problemas: el primer problema es cómo proporcionar * * acceso a la memoria; el segundo es la exclusión mutua de la memoria pública * * *, que es responsabilidad del desarrollador del programa.
5. Semáforo:
Se utiliza principalmente como medio de sincronización y exclusión mutua entre procesos y entre diferentes hilos de un mismo proceso.
6. Socket;
Este es un mecanismo de comunicación entre procesos relativamente común, que se puede utilizar para la comunicación entre procesos entre diferentes máquinas en la red y se usa ampliamente.
t; /*El número de procesos en espera de aumento en semval*/
ushort semzcnt/*El número de procesos en espera de semval = 0 */
}
# incluir & ltsys/types .
# incluir & ltsys/IPC . /SEM . h & gt;
int semget(key_t key, int nsems, int flag
Key es la palabra clave de la estructura IPC mencionada anteriormente). Flag determinará si se creará un nuevo conjunto de semáforos en el futuro o si se hará referencia a un conjunto de semáforos existente.
Nsems es el número de semáforos del conjunto. Si está creando una nueva colección (normalmente en un servidor), debe especificar nsems; si se refiere a un conjunto de semáforos existente (normalmente en un cliente), especifique nsems como 0.
La función Semctl se utiliza para operar semáforos.
int semctl(int semid, int semnum, int cmd, union semun arg);
Se implementan diferentes operaciones a través del parámetro cmd. Se definen siete operaciones diferentes en el archivo de encabezado sem.h, que puede usarse como referencia en la programación real.
La función semop realiza automáticamente una serie de operaciones en la colección de semáforos.
int semop(int semid, struct sembuf semoparray[], size_t nops);
Semoparray es un puntero a la matriz de operaciones del semáforo. Nops especifica los operandos en la matriz.
A continuación, veamos un ejemplo concreto. Crea una palabra clave con una estructura IPC específica y un semáforo, crea un índice en el semáforo, modifica el valor del semáforo al que apunta el índice y finalmente borra el semáforo. En el código siguiente, la función ftok genera la palabra clave IPC única que mencionamos anteriormente.
# incluir & ltstdio.h & gt
# incluir & ltsys/types
# incluir & ltsys/SEM . ;
# include & ltsys/IPC . h & gt;
void main() {
key_t clave única /*Definir una palabra clave IPC */
int id
struct sembuf lock _ it
union semun options
int I;
unique_key = ftok(",",' a ');/*Generar una clave, el carácter "a" es una semilla aleatoria*/
/*Crear una nueva colección de semáforos*/
id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);
printf("Semaphore id=%d\n ",id);
opciones . ; /*Establecer el valor de la variable*/
semctl(id, 0, SETVAL, options /*Establecer el semáforo en el índice 0*/
/*Imprimir el valor de); el semáforo*/
i = semctl(id, 0, GETVAL, 0);
printf("El valor del semáforo en el índice 0 es %d\ n ", I
/*Restablecer el semáforo a continuación*/
lock _ it . SEM _ num = 0 /*Qué semáforo configurar*/
lock_it; .SEM_op =-1;/*Definir operación*/
lock_it.sem_flg = IPC_NOWAIT/*Modo de operación*/
if (semop(id, & amplock_it, 1) == -1) {
printf("No se puede bloquear el semáforo.
\n ");
Salir(1);
}
i = semctl(id, 0, GETVAL, 0);
printf("El valor del semáforo en el índice 0 es %d\n ", I
/*Borrar el semáforo*/
semctl(id, 0,); IPC_RMID , 0);
}
semget()
Puedes usar la llamada al sistema semget() para crear un nuevo conjunto de semáforos o acceder a un semáforo existente. set Cantidad establecida:
Llamada al sistema: SEM get();
Prototipo: int semget (key_tkey, int nsems, int SEM flg);
Valor de retorno : Si tiene éxito, devuelve el identificador IPC del conjunto de semáforos. Si falla, devuelve -1: errno = acceso (sin permiso)
EEXIST (el conjunto de semáforos ya existe y no se puede crear)
p>EIDRM (El conjunto de semáforos ha sido eliminado)
ENOENT (El conjunto de semáforos no existe y no utiliza IPC_CREAT)
ENOMEM (La memoria insuficiente no puede crear un nuevo uno) Conjunto de semáforos)
ENOSPC (límite superior)
El primer parámetro de la llamada al sistema semget() es el valor de la palabra clave (generalmente devuelto por la llamada al sistema ftok()). este valor con los valores de palabras clave de otros conjuntos de semáforos presentes en el sistema están relacionados con el contenido del parámetro semflg. IPC_EXCL crea un conjunto de semáforos si no existe en el núcleo del sistema. IPC_CREAT, la llamada fallará si el conjunto de semáforos ya existe. Si IPC_CREAT se usa solo, semget() devuelve el identificador del conjunto de semáforos recién creado o devuelve un semáforo con el mismo valor clave que ya existe en el sistema. del semáforo. Si se usa IPC_EXCL con IPC_CREAT, devuelve el identificador del conjunto de semáforos recién creado o -1. El parámetro nsems por sí solo no tiene sentido. El número máximo de semáforos en el conjunto de semáforos se define en linux/sem.h. :
# definesemmsl 32/* <= 512 maxnumofsemaphoresperid */
El siguiente es un programa abierto y para crear un conjunto de semáforos:
into pen _ semáforo _ set(key _ t keyval, int numsems)
{
intsid
if(! numsems)
return(-1);
if((sid=semget(mykey, numsems, IPC_CREAT|0660))==-1)
{
retorno(-1);
}
retorno(sid);
}
} ;
=========================================== ====================
semop()
Llamada al sistema: semop();
Llamar al prototipo: int semop (int semid, struct sembuf * SOPs, unsigned edn SOPs);
Valor de retorno: 0, si tiene éxito. -1, si falla: errno=E2BIG (nsops es mayor que el número máximo de operaciones).
EACCESS (permisos insuficientes)
EAGAIN (se utiliza IPC_NOWAIT, pero la operación no puede continuar)
Predeterminado (la dirección señalada por SOPS no es válida)
EIDRM (el conjunto de semáforos se ha eliminado)
EINTR (Otras señales recibidas durante el sueño)
EINVAL (el conjunto de semáforos no existe o el semid no es válido) p>
ENOMEM (USE SEM_UNDO, pero no hay suficiente memoria para crear la estructura de datos requerida)
ERANGE (Amplitud de señal fuera de rango)
El primer parámetro es el valor de la palabra clave. El segundo parámetro es un puntero a la matriz sobre la que se va a operar. El tercer parámetro es el operando de la matriz. El parámetro sops apunta a una matriz compuesta de sembufs. Esta matriz está definida en linux/sem.h:
/*semop systemcall acepta estas matrices*/
structsembuf{
ushortsem _ num/* Índice de semáforo en la matriz*/
shortsem _ op/*Operación de semáforo*/
shortsem _ flg/*Operación bandera*/
sem_num a ser El número de semáforos manejados.
Operaciones realizadas por SEM_op
Indicador de operación Sem_flg.
Si sem_op es negativo, el semáforo se restará de su valor. Esto está relacionado con los recursos controlados por el semáforo. Si no se utiliza IPC_NOWAIT, el proceso de llamada dormirá hasta que se pueda utilizar el recurso controlado por el semáforo. Si sem_op es un número positivo, el semáforo aumenta su valor. Es decir, el proceso libera el recurso controlado por el semáforo. Finalmente, si sem_op es 0, el proceso de llamada llamará a sleep() hasta que el valor del semáforo sea 0. Esto se utiliza cuando un proceso está esperando un recurso completamente gratuito.
============================================ === ====================
semctl()
Llamada al sistema: SEM CTL(); p>
Prototipo: int semctl (int semid, int semnum, int cmd, union semunarg);
Valor de retorno: Número positivo si tiene éxito.
Si falla, -1: errno = acceso (permisos insuficientes).
Predeterminado (la dirección señalada por arg no es válida)
EIDRM (el conjunto de semáforos ha sido eliminado)
EINVAL (el conjunto de semáforos no existe o el semid no es válido)
EPERM (EUID no tiene derecho a usar cmd)
ERANGE (amplitud de la señal fuera de rango)
El sistema llama a semctl para realizar operaciones de control en el conjunto de semáforos. Esto es muy similar a la llamada al sistema msgctl en las colas de mensajes. Pero los parámetros de estas dos llamadas al sistema son ligeramente diferentes. Porque los semáforos generalmente se utilizan como un grupo de semáforos, no como un solo semáforo. Por lo tanto, en la operación del conjunto de semáforos, es necesario conocer no solo el valor de la palabra clave IPC, sino también el semáforo específico en el conjunto de semáforos. Ambas llamadas al sistema toman el parámetro cmd, que indica el comando específico a operar. El último parámetro en las dos llamadas al sistema también es diferente. En la llamada al sistema msgctl, el último parámetro es un puntero a una estructura de datos utilizada en el kernel. Usamos esta estructura de datos para obtener información sobre la cola de mensajes y establecer o cambiar los derechos de acceso y los usuarios de la cola. Sin embargo, los semáforos admiten comandos opcionales adicionales, que requieren estructuras de datos más complejas.
El primer parámetro de la llamada al sistema semctl() es el valor de la palabra clave. El segundo parámetro es el número de semáforos.
Los comandos que se pueden usar en el parámetro cmd son los siguientes:
IPC_STAT lee la estructura de datos semid_ds del conjunto de semáforos y la almacena en el parámetro buf en semun.
IPC_SET establece ipc_perm en la estructura de datos semid_ds del conjunto de semáforos y su valor se toma del buf en semun.