Lograr que un proceso de software se comunique con otro proceso de software es un delicado acto de equilibrio. Sin embargo, puede ser una función vital para una aplicación, por lo que es un problema que cualquier programador que se embarque en un proyecto complejo debe resolver. Si su aplicación necesita iniciar un trabajo que está siendo manejado por el software de otra persona; para monitorear una acción que está siendo realizada por un periférico oa través de una red; o para detectar una señal de alguna otra fuente, cuando su software se basa en algo fuera de su propio código para saber qué hacer a continuación o cuándo hacerlo, debe pensar en la comunicación entre procesos (IPC).
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
El sistema operativo Unix dio cuenta de esto hace mucho tiempo, posiblemente debido a una expectativa temprana de que el software se originaría a partir de diversas fuentes. Siguiendo la misma tradición, Linux proporciona muchas de las mismas interfaces para IPC y algunas nuevas. El kernel de Linux presenta varios métodos IPC y el paquete util-linux contiene el ipcmk , ipcrm , ipc y lsipc comandos para monitorear y administrar mensajes IPC.
Mostrar información de IPC
Antes de experimentar con IPC, debe saber qué funciones de IPC ya están instaladas en su sistema. El lsipc comando proporciona esa información.
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI Number of message queues 32000 0 0.00%
MSGMAX Max size of message (byt.. 8192 - -
MSGMNB Default max size of queue 16384 - -
SHMMNI Shared memory segments 4096 79 1.93%
SHMALL Shared memory pages 184[...] 25452 0.00%
SHMMAX Max size of shared memory 18446744073692774399
SHMMIN Min size of shared memory 1 - -
SEMMNI Number of semaphore ident 32000 0 0.00%
SEMMNS Total number of semaphore 1024000.. 0 0.00%
SEMMSL Max semaphores per semap 32000 - -
SEMOPM Max number of operations p 500 - -
SEMVMX Semaphore max value 32767 - -
Puede notar que esta lista de muestra incluye tres tipos diferentes de mecanismos IPC, cada uno disponible en el kernel de Linux:mensajes (MSG), memoria compartida (SHM) y semáforos (SEM). Puede ver la actividad actual en cada uno de esos subsistemas con ipcs comando:
$ ipcs
------ Message Queues Creators/Owners ---
msqid perms cuid cgid [...]
------ Shared Memory Segment Creators/Owners
shmid perms cuid cgid [...]
557056 700 seth users [...]
3571713 700 seth users [...]
2654210 600 seth users [...]
2457603 700 seth users [...]
------ Semaphore Arrays Creators/Owners ---
semid perms cuid cgid [...]
Esto muestra que actualmente no hay mensajes ni conjuntos de semáforos, pero se están utilizando varios segmentos de memoria compartida.
Hay un ejemplo simple que puede realizar en su sistema para que pueda ver uno de estos sistemas en funcionamiento. Implica algo de código C, por lo que debe tener herramientas de compilación en su sistema. Los nombres de los paquetes que debe instalar para poder compilar a partir del código fuente varían según su distribución, así que consulte su documentación para obtener información específica. Por ejemplo, en las distribuciones basadas en Debian, puede obtener información sobre los requisitos de compilación en la sección BuildingTutorial de la wiki, y en las distribuciones basadas en Fedora, consulte la sección Instalación de software desde el origen de los documentos.
Crear una cola de mensajes
Su sistema ya tiene una cola de mensajes predeterminada, pero puede crear la suya propia usando el ipcmk comando:
$ ipcmk --queue
Message queue id: 32764
Escriba un remitente de mensaje IPC simple, codificando en el ID de la cola para simplificar:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
strcpy(message.text,"opensource.com");
msgsnd(msqid, &message, sizeof(message), 0);
printf("Message: %s\n",message.text);
printf("Queue: %d\n",msqid);
return 0;
}
Compile la aplicación y ejecútela:
$ gcc msgsend.c -o msg.bin
$ ./msg.bin
Message: opensource.com
Queue: 32769
Acabas de enviar un mensaje a tu cola de mensajes. Puede verificar eso con el ipcs comando, usando el --queue opción para limitar la salida a la cola de mensajes:
$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x7b341ab9 0 seth 666 0 0
0x72bd8410 32764 seth 644 24 1
También puede recuperar esos mensajes con:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
struct msgbuffer {
char text[24];
} message;
int main() {
int msqid = 32764;
msgrcv(msqid, &message, sizeof(message),0,0);
printf("\nQueue: %d\n",msqid);
printf("Got this message: %s\n", message.text);
msgctl(msqid,IPC_RMID,NULL);
return 0;
Compilar y ejecutar con:
$ gcc get.c -o get.bin
$ ./get.bin
Queue: 32764
Got this message: opensource.com
Descargar el eBook
Este es solo un ejemplo de las lecciones disponibles en la guía para la comunicación entre procesos en Linux de Marty Kalin, el último libro electrónico descargable gratuito (y Creative Commons) de Opensource.com. En solo unas pocas lecciones breves, aprenderá sobre los métodos POSIX de IPC a partir de colas de mensajes, memoria compartida y semáforos, sockets, señales y mucho más. Siéntese con el libro de Marty y emergerá como un programador mejor informado. Pero no es solo para codificadores experimentados:si todo lo que escribe son scripts de shell, hay muchos conocimientos prácticos sobre canalizaciones (con nombre y sin nombre) y archivos compartidos, así como conceptos importantes que necesita saber cuando usa un archivo compartido. o una cola de mensajes externa.
Si está interesado en crear un gran software que esté escrito para ser dinámico y consciente del sistema, necesita saber acerca de IPC. Deje que este libro sea su guía.