1.基本概念
消息队列就是一个消息的链
表。而一条消息则可看作一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。
第9类 消息队列编程
9.1 创建/打开消息队列
9.1.1 函数名
Msgget
9.1.2 函数原形
Int msgget(key_t key, int msgflg);
9.1.3 函数功能
获得一个消息队列描述符
9.1.4 所属头文件
9.1.5 返回值
成功:返回消息队列的描述符id 失败:-1
9.1.6 参数说明
Key:键值
Msgflg:消息标志位,IPC_CREAT:表明新创建一个消息队列
9.1.7 范例代码
9.2 发送数据
9.2.1 函数名
Msgsnd
9.2.2 函数原形
Int msgsnd(int msqid, const void *msgp, size_t msgsz,int msgflg);
9.2.3 函数功能
发送消息到消息队列
9.2.4 所属头文件
9.2.5 返回值
成功:获取的消息内容长度 失败:-1
9.2.6 参数说明
Msqid:消息描述符id.
*msgp:指向要发送的消息
Msgsz:消息长度
Msgflg:标志位
9.3 读出消息
9.3.1 函数名
Msgrcv
9.3.2 函数原形
Ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
9.3.3 函数功能
读取消息
9.3.4 所属头文件
9.3.5 返回值
成功:0 失败:-1
9.3.6 参数说明
Msqid:消息描述符id.
*msgp:存放去除的消息
Msgsz:消息长度
Msgtyp: 消息类型 0:只取第一个消息 >0:取消息队列中类型等于msgtyp的第一条消息 <0:比msgtyp绝对值小的类型,优先取小的消息
Msgflg:标志位
9.4 控制消息队列
9.4.1 函数名
Msgctl
9.4.2 函数原形
Int msgctl(int msqid, int cmd, struct msqid_ds *buf);
9.4.3 函数功能
控制消息队列
9.4.4 所属头文件
9.4.5 返回值
成功:0 失败:-1
9.4.6 参数说明
Msqid:消息队列描述符id
Cmd:操作命令, IPC_RMID(用来删除)
*buf:获取内核中的msgid_ds结构
send.c:
-
#include <sys/types.h>
-
#include <sys/ipc.h>
-
#include <sys/msg.h>
-
-
struct msgt
-
{
-
long msgtype;
-
char msgtext[1024];
-
};
-
-
int main()
-
{
-
int msqid;
-
int msg_type;
-
char str[256];
-
struct msgt msgs;
-
-
/*创建消息队列*/
-
msqid = msgget(1024 , IPC_CREAT);
-
-
while(1)
-
{
-
printf("please input message type, 0 for quit!\n");
-
/*获取键盘输入,消息类型、消息数据*/
-
scanf("%d", &msg_type);
-
/*如果用户出入的消息类型为0,退出该循环*/
-
if(msg_type == 0)
-
break;
-
printf("please input message content!\n");
-
scanf("%s", str);
-
-
msgs.msgtype = msg_type;
-
strcpy(msgs.msgtext, str);
-
/*发送消息*/
-
msgsnd(msqid, &msgs, sizeof(struct msgt), 0);
-
-
}
-
/*删除消息队列*/
-
msgctl(msqid, IPC_RMID, 0);
-
}
receive.c:
-
#include <sys/types.h>
-
#include <sys/ipc.h>
-
#include <sys/msg.h>
-
#include <unistd.h>
-
-
int msqid = 0;
-
-
struct msgt
-
{
-
long msgtype;
-
char msgtext[1024];
-
};
-
-
void childprocess()
-
{
-
struct msgt msgs;
-
while(1)
-
{
-
/*接收消息队列*/
-
msgrcv(msqid, &msgs, sizeof(struct msgt), 0, 0);
-
/*打印消息队列中的数据*/
-
printf("msg text: %s \n", msgs.msgtext);
-
}
-
return;
-
}
-
-
void main()
-
{
-
pid_t cpid;
-
int i;
-
/*打开消息队列*/
-
msqid = msgget(1024, IPC_EXCL);
-
/*创建3个子进程*/
-
for(i=0;i<3;i++)
-
{
-
cpid = fork();
-
if(cpid < 0)
-
printf("creat child process error!\n");
-
else if(cpid == 0)
-
childprocess();
-
}
-
}
阅读(620) | 评论(0) | 转发(0) |