System V or POSIX ?
该使用哪个呢, 这是个问题 ...
相对而言,我更倾向于后者 posix mq
posix mq 的概况看这里:man mq_overview
简单的实现代码:
#include <mqueue.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define MY_MQ_NAME "/my_test_mq"
#define MSG_LEN 8192
struct my_msg
{
unsigned int msg_type;
char msg_date[MSG_LEN];
};
int main(int argc, char ** argv)
{
unsigned int prio;
struct my_msg msg;
struct mq_attr attr;
ssize_t mq_ret;
char mq_msg[MSG_LEN];
mqd_t mqd;
// creat
attr.mq_maxmsg = 40960;
attr.mq_msgsize = MSG_LEN;
mqd = mq_open(MY_MQ_NAME, O_RDWR|O_CREAT, S_IRWXU|S_IRWXG, &attr);
if(mqd < 0)
{
perror("mq_open error");
return -1;
}
//get attribute
mq_ret = mq_getattr(mqd, &attr);
if(mq_ret == -1)
{
perror("mq_getattr");
mq_close(mqd);
exit(1);
}
printf("max #msgs=%ld, max #bytes/msg=%ld, current msg =%ld\n",\
attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);
//reveive msg
while(1)
{
mq_ret = mq_receive(mqd, mq_msg, sizeof(mq_msg), NULL);
printf("%s\n",mq_msg);
if(mq_ret == -1)
{
perror("mq_receive error");
mq_close(mqd);
break;
}
usleep(32);
}
mq_close(mqd);
return 0;
}
发送消息代码:
int main(int argc, char **argv)
{
int mq_ret;
mqd_t mqd;
size_t len;
char *ptr;
unsigned int prio;
prio = 0;
ptr = (char*)malloc(MSG_LEN);
if(ptr == NULL)
{
perror("malloc ptr error");
return -1;
}
strcpy(ptr,"Hello mqueue, I am who you do not know !");
mqd = mq_open(MY_MQ_NAME, O_WRONLY);
if(mqd == -1)
{
perror("mq_open error");
return -1;
}
while(1)
{
mq_ret = mq_send(mqd, ptr, MSG_LEN, prio);
if(mq_ret == -1)
{
perror("mq_send error");
mq_close(mqd);
break;
}
usleep(2);
}
return 0;
}
另外, Linux 系统中POSIX mq 的大小限制查看及设置命令:
# ulimit -q
当然也可以在程序中设置:
struct rlimit new_rlimit;
new_rlimit.rlim_cur = NEW_MQ_MEM_LIMIT;
new_rlimit.rlim_max = NEW_MQ_MEM_LIMIT;
if (setrlimit(RLIMIT_MSGQUEUE, &new_rlimit) != 0)
{
perror("Failed BUG exploit! setrlimit() didn't return success");
return EXIT_FAILURE;
}
参考: