System V Msg colas en Linux no funcionan como se esperaba
-
23-08-2019 - |
Pregunta
Tengo la siguiente aplicación que reproduce un problema que estoy teniendo en una aplicación más grande, con colas de mensajes del sistema v. básicamente, la función principal genera una clave, a continuación, crea una cola de mensajes con msgget (). Entonces 3 tenedores se generan, cada uno con un ID diferente. cada uno de ellos funciona msgrcv con un número posative diferente (por lo que están a la espera para los diferentes mensajes).
Principal luego duerme durante unos segundos una envía un mensaje al id = 3. Sin embargo, no el tercer hilo que se despierta, pero una diferente en su lugar. Este código se aísla por completo para que pueda probar por ti mismo. Lo que está mal con este código?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
struct dummy_struct {
long mtype;
char message[255];
};
int msg_queue_id;
void recv_thread(int id);
int main(int argc, char **argv)
{
int i;
key_t key;
struct dummy_struct dummy = { 3, "hello" };
//create a unique key
if (key = ftok("/mnt/mydocuments/code/sys_v_fork_test/main.c", 'a') == -1)
{
printf("ftok didn't work\n");
exit(1);
}
//create the unix sys 5 message queue
if ((msg_queue_id = msgget(key, 0644 | IPC_CREAT)) == -1)
{
printf("msgget failed\n");
exit(1);
}
else
printf("my message queue id: %i\n", msg_queue_id);
//fork off multiple recievers
for (i = 1; i < 4; i++) // <- NOTE: 1 -> 4
{
if (fork() == 0)
recv_thread(i);
}
printf("sleeping\n");
sleep(5);
//wait a little then send a message
printf("sending message\n");
if (msgsnd(msg_queue_id, &dummy, sizeof(struct dummy_struct), 0) == -1)
{
printf("msgsnd failed\n");
}
printf("main thread exiting");
_exit(0);
}
void recv_thread(int id)
{
struct dummy_struct dummy;
printf("recv_thread with id: %i\n", id);
if (msgrcv(msg_queue_id, &dummy, sizeof(struct dummy_struct), id, 0) == -1)
printf("error in msgrcv\n");
else
printf("thread %i got %s back\n", id, dummy.message);
}
Si espero para 2 que significa que los mensajes cuya estructura contiene un mtype se define en exactamente 2. 3 por 3 y así uno. Mi punto de referencia era esta guía: http: //www.ecst .csuchico.edu / ~ beej / guía / IPC / mq.html . ¿Alguien puede ayudar por favor? (Puede que tenga que modificar la línea ftok de código para apuntar a un archivo válido en su propia máquina para probar con éxito). Estoy corriendo Fedora 10 en un EeePC 1000H
Solución
Ahh pensar lo he arreglado. Es porque yo estaba usando un int en lugar de un tiempo para que el primer miembro fijado en la estructura de la "mtype". pasando {1l, "hola"} en su lugar y el cambio de la definición de i a largo parece haber arreglado