进程通信--消息队列 听课笔记

随内核持续
[size=x-large]键值[/size]

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(char *pathname, char proj)

pathname 文件名
proj 项目名, 不为0即可
返回文件名对应的键值

[size=x-large]打开消息队列[/size]

#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgget(key_t key, int msgflg)

key: 键值, 由ftok获得-->key参数为IPC_PRIVATE则创建新消息队列
msgflg: 标志位
IPC_CREATE 创建新的消息队列
IPC_EXCL 与IPC_CREAT一同使用, 如果消息队列已经存在, 则返回错误
IPC_NOWAIT 非阻塞
返回值: 返回与key对应的消息队列描述字

[size=x-large]发送消息[/size]

#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgsnd(int msqid, strcut msgbuf *msgp, int msgsz, int msgflg)

struct msgbuf{
long mtype;//消息的类型
char *mtext;//消息数据的首地址
}


[size=x-large]接收消息[/size]

#include <sys/types.h>
#include <sys/ipc.h>
#inlcude <sys/msg.h>
int msgrcv(int msqid, strcut msgbuf *msgp, int msgsz, long msgtyp, int msgflg)
//从msgid代表的消息队列中读取一个msgtyp类型的消息
//存储在msgp指向的msgbuf结构中, 队列中这条消息将被删除


[size=x-large]示例[/size]

#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>

struct msg_buf
{
int mtype;
char data[255];
};

int main()
{
key_t key;
int msgid;
int ret;
struct msg_buf msgbuf;

key=ftok("/tmp/2",'a');
printf("key =[%x]\n",key);
msgid=msgget(key,IPC_CREAT|0666); /*通过文件对应*/

if(msgid==-1)
{
printf("create error\n");
return -1;
}

msgbuf.mtype = getpid();
strcpy(msgbuf.data,"test haha");
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
if(ret==-1)
{
printf("send message err\n");
return -1;
}

memset(&msgbuf,0,sizeof(msgbuf));
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT);
if(ret==-1)
{
printf("recv message err\n");
return -1;
}
printf("recv msg =[%s]\n",msgbuf.data);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值