¿Cómo se implementa una cola de mensajes en el kernel de Linux?

Pregunta:

Me gustaría saber cómo se implementan las colas de mensajes en el kernel de Linux.

Respuesta:

El kernel de Linux (2.6) implementa dos colas de mensajes:
(en lugar de 'listas de mensajes', ya que la implementación se realiza utilizando una lista enlazada que no sigue estrictamente el principio FIFO)

Mensajes del sistema V IPC

La cola de mensajes del Sistema V.

Un proceso puede invocar msgsnd() para enviar un mensaje. Debe pasar el identificador de IPC de la cola de mensajes de recepción, el tamaño del mensaje y la estructura del mensaje, incluidos el tipo de mensaje y el texto.

Por otro lado, un proceso invoca a msgrcv() para recibir un mensaje, pasando el identificador IPC de la cola de mensajes, donde debe almacenarse el mensaje, el tamaño y un valor t .

t especifica el mensaje devuelto de la cola, un valor positivo significa que se devuelve el primer mensaje con su tipo igual at , un valor negativo devuelve el último mensaje igual al tipo ty cero devuelve el primer mensaje de la cola.

Estas funciones se definen en include / linux / msg.h y se implementan en ipc / msg.c

Existen limitaciones sobre el tamaño de un mensaje (máx.), El número total de mensajes (mni) y el tamaño total de todos los mensajes en la cola (mnb):

$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384

La salida anterior es de un sistema Ubuntu 10.10, los valores predeterminados se definen en msg.h.

Aquí se explican más cosas increíblemente antiguas de la cola de mensajes de System V.

Cola de mensajes POSIX

El estándar POSIX define un mecanismo de cola de mensajes basado en la cola de mensajes de System V IPC, extendiéndolo con algunas funcionalidades:

  • Interfaz simple basada en archivos para la aplicación
  • Soporte para las prioridades de los mensajes
  • Soporte para notificación asincrónica
  • Tiempos de espera para operaciones de bloqueo

Ver ipc / mqueue.c

Ejemplo

util-linux proporciona algunos programas para analizar y modificar las colas de mensajes y la especificación POSIX ofrece algunos ejemplos de C:

Cree una cola de mensajes con ipcmk ; generalmente, haría esto llamando a funciones C como ftok() y msgget() :

$ ipcmk -Q

Veamos qué sucedió usando ipcs o con cat /proc/sysvipc/msg :

$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

Ahora llena la cola con algunos mensajes:

$ cat <<EOF >msg_send.c
#include <string.h>
#include <sys/msg.h> 

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;

  msg.type = 1;
  strcpy(msg.text, "This is message 1");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);
  strcpy(msg.text, "This is message 2");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);

  return 0;
}
EOF

Nuevamente, generalmente no codificas el msqid en el código.

$ gcc -o msg_send msg_send.c
$ ./msg_send
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        40           2        

Y el otro lado, que estará recibiendo los mensajes:

$ cat <<EOF >msg_recv.c
#include <stdio.h>
#include <sys/msg.h>

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;
  long msgtyp = 0;

  msgrcv(msqid, (void *) &msg, sizeof(msg.text), msgtyp, MSG_NOERROR | IPC_NOWAIT);
  printf("%s \n", msg.text);

  return 0;
}
EOF

Mira qué pasa:

$ gcc -o msg_recv msg_recv.c
$ ./msg_recv
This is message 1
$ ./msg_recv
This is message 2
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

Después de dos recepciones, la cola está vacía nuevamente.

Luego, elimínelo especificando la clave ( -Q ) o msqid ( -q ):

$ ipcrm -q 65536

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım