cat /proc/sys/kernel/msgmax最大消息长度限制
cat /proc/sys/kernel/msgmnb消息队列总的字节数
cat /proc/sys/kernel/msgmni消息条目数
消息队列综合案例
//server
#include
#include
#include
#include
#include
#include
#include
#include
#define ERR_EXIT(m)
do
{
perror(m);
}
while(0);
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
};
int main()
{
struct msgbuf revbuf;
int key = 0;
int msgid = 0;
int ret = 0;
int pid= 0;
key = ftok("./", '2');
if (key < 0)
ERR_EXIT("ftok");
//获取消息队列
ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
if (ret < 0)
{
if (errno == EEXIST) //如果消息队列已存在
msgid = msgget(key, 0666);
else
ERR_EXIT("msgget:");
}
else
msgid = ret;
//设置发送buf
memset(&revbuf, 0, sizeof(revbuf));
revbuf.mtype = 1; //接收方总是接收类型1
while (1)
{
ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), 1, 0);
if (ret < 0)
ERR_EXIT("msgrcv:");
fputs(revbuf.mtext + 4, stdout);
pid = *((int *)(revbuf.mtext));
revbuf.mtype = pid;
ret = msgsnd(msgid, &revbuf, ret, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgsnd");
}
return 0;
}
//clt
#include
#include
#include
#include
#include
#include
#include
#include
#define ERR_EXIT(m)
do
{
perror(m);
}
while(0);
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
};
int main()
{
struct msgbuf sndbuf;
struct msgbuf revbuf;
int key = 0;
int msgid = 0;
int ret = 0;
int pid= 0;
key = ftok("./", '2');
if (key < 0)
ERR_EXIT("ftok");
//获取消息队列
ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
if (ret < 0)
{
if (errno == EEXIST) //如果消息队列已存在
msgid = msgget(key, 0666);
else
ERR_EXIT("msgget:");
}
else
msgid = ret;
//设置发送buf
memset(&sndbuf, 0, sizeof(sndbuf));
memset(&revbuf, 0, sizeof(revbuf));
pid = getpid(); //获取pid作为包头发出去
while (fgets(sndbuf.mtext + 4, sizeof(sndbuf.mtext), stdin) != NULL)
{
sndbuf.mtype = 1; //发送方总是发送类型1
memcpy(sndbuf.mtext, &pid, 4);
//*((int*)sndbuf.mtext) = pid; //这句话是指将sndbuf.mtext最前面四个字节指向一个int类型指针
ret = msgsnd(msgid, &sndbuf, strlen(sndbuf.mtext + 4) + 4, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgsnd");
sleep(1);
//读取
ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), pid, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgrcv:");
fputs(revbuf.mtext + 4, stdout);
memset(&sndbuf, 0, sizeof(sndbuf));
memset(&revbuf, 0, sizeof(revbuf));
}
return 0;
}