1.
基本概念
消息队列就是一个消息的链 表。而一条消息则可看作一 个记录,具有特定的格式。 进程可以向中按照一定的规 则添加新消息;另一些进程 则可以从消息队列中读走消 息。
第9类 消息队列编程
send.c:
receive.c:
阅读(70) | 评论(0) | 转发(0) |
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
消息队列就是一个消息的链 表。而一条消息则可看作一 个记录,具有特定的格式。 进程可以向中按照一定的规 则添加新消息;另一些进程 则可以从消息队列中读走消 息。
第9类 消息队列编程
9.1 创建/打开消息队列
9.1.1 函数名
Msgget
9.1.2 函数原形
Int msgget(key_t key, int msgflg);
9.1.3 函数功能
获得一个消息队列描述符
9.1.4 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
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 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
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 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
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 所属头文件
<sys/types.h> <sys/ipc.h> <sys/msg.h>
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);
- }
- #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();
- }
- }
给主人留下些什么吧!~~
评论热议