msg_queue.c
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <native/task.h>
#include <native/queue.h>
#define TASK_PRIO 99
#define TASK_MODE 0
#define TASK_STKSZ 0
RT_QUEUE q_desc;
RT_TASK task_desc;
void consumer (void *cookie)
{
ssize_t len;
void *msg;
int err;
err = rt_queue_bind(&q_desc,"SomeQueueName",TM_INFINITE);
if (err)
fail();
while ((len = rt_queue_receive(&q_desc,&msg,TM_INFINITE)) > 0)
{
printf("received message> len=%d bytes, ptr=%p, s=%s\n",
len,msg,(const char *)msg);
rt_queue_free(&q_desc,msg);
}
rt_queue_unbind(&q_desc);
if (len != -EIDRM)
fail();
}
int main (int argc, char *argv[])
{
static char *messages[] = { "hello", "world", NULL };
int n, len;
void *msg;
mlockall(MCL_CURRENT|MCL_FUTURE);
err = rt_task_create(&task_desc,
"MyTaskName",
TASK_STKSZ,
TASK_PRIO,
TASK_MODE);
if (!err)
rt_task_start(&task_desc,&task_body,NULL);
for (n = 0; messages[n] != NULL; n++)
{
len = strlen(messages[n]) + 1;
msg = rt_queue_alloc(&q_desc,len);
if (!msg)
fail();
strcpy(msg,messages[n]);
rt_queue_send(&q_desc,msg,len,Q_NORMAL);
}
rt_task_delete(&task_desc);
}