linux查看队列 msg,linux第10天 msg消息队列

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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值