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;
}