Home Article Practice 06_消息队列

06_消息队列

2024-04-26 08:47  views:360  source:拼搏百天我要上蓝翔    

、消息队列的练习知识点1【消息队列的概述】消息队列是消息的链表,存放在内存中,由内核维护 消息队列的特点。1、
消息队列中的消息是有类型的。2、消息队列中的消息是有格式的。3、消息队列可以实现消息的随机查询。消息不一定要以
先进先出的次序读取,编程时可以按消息的类型读取。4、消息队列允许一个或多个进程向它写入或者读取消息。5、与无名
管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。6、每个消息队列都有消息队列标识符,
消息队列的标识符在整个系统中是唯一的。7、只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除
消息队列,消息队列会一直存在于系统中在ubuntu 某些版本中消息队列限制值如下:每个消息内容最多为8K字节每
个消息队列容量最多为16K字节系统中消息队列个数最多为1609个系统中消息个数最多为16384个知识点2【消息
队列的API】1、获取系统唯一的key值1 #include <sys/types。h>2 #include
<sys/ipc。h>3 key_t ftok(const char *pathname, int proj_
id);功能:获得项目相关的唯一的IPC键值。参数:pathname:路径名proj_id:项目ID,非0整数
(只有低8位有效)返回值:成功返回key值,失败返回 -12、创建消息队列1 #include <sys/ms
g。h>2 int msgget(key_t key, int msgflg);功能:创建一个新的或打开一个已
经存在的消息队列。不同的进程调用此函数,只要用相同的key值就能得到同一个消息队列的标识符。参数:key:IP
C键值。msgflg:标识函数的行为及消息队列的权限。参数:msgflg的取值:IPC_CREAT:创建消息队
列。IPC_EXCL:检测消息队列是否存在。位或权限位:消息队列位或权限位后可以设置消息队列的访问权限,格式和
open函数的mode_t一样,但可执行权限未使用。返回值:成功:消息队列的标识符,失败:返回-1查看消息队列
:1 ipcs ‐q删除消息队列1 ipcrm ‐q msqid3、消息队列的信息 格式定义1 typedef
struct _msg2 {3 long mtype; /*消息类型 必须是第一个成员 必须是long类型*
/45 char mtext[100]; /*消息正文 不止一个成员*/6 。。。 /*消息的正文可以有多个成
员*/7 }MSG;4、发送消息1 #include <sys/msg。h>2 int msgsnd(int
msqid, const void *msgp,size_t msgsz, int msgflg);功能:将新
消息添加到消息队列。参数:msqid:消息队列的标识符。msgp:待发送消息结构体的地址。msgsz:消息正文
的字节数。msgflg:函数的控制属性0:msgsnd调用阻塞直到条件满足为止。IPC_NOWAIT: 若消息
没有立即发送则调用该函数的进程会立即返回。返回值:成功:0;失败:返回-15、接收消息1 #include <
sys/msg。h>2 ssize_t msgrcv(int msqid, void *msgp, size_
t msgsz, long msgtyp, int msgflg);功能:从标识符为msqid的消息队列中接收
一个消息。一旦接收消息成功,则消息在消息队列中被删除。参数:msqid:消息队列的标识符,代表要从哪个消息列中
获取消息。msgp: 存放消息结构体的地址。msgsz:消息正文的字节数。msgtyp:感兴趣消息的类型、可以
有以下几种类型msgtyp = 0:返回队列中的第一个消息msgtyp > 0:返回队列中消息类型为msgty
p的消息msgtyp < 0:返回队列中消息类型值小于或等于msgtyp绝对值的消息,如果这种消息有若干个,则
取类型值最小的消息。注意:若消息队列中有多种类型的消息,msgrcv获取消息的时候按消息类型获取,不是先进先出
的。在获取某类型消息的时候,若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原msgflg:函数的
控制属性0:msgrcv调用阻塞直到接收消息成功为止。MSG_NOERROR:若返回的消息字节数比nbytes
字节数多,则消息就会截短到nbytes字节,且不通知消息发送进程。IPC_NOWAIT:调用进程会立即返回。若
没有收到消息则立即返回-1。返回值:成功返回读取消息的长度,失败返回-1总结:不管是发送者还是接收者1 fto
k 得到唯一的key2 msgget 创建消息队列发送者1 MSG msg;2 msg。mtype = 接收感
兴趣的类型值;3 msgsnd(msg_id, &msg, sizeof(MSG) ‐ sizeof(long
), 0);//发送消息到消息队列接收者1 MSG msg;2 msgrcv(msg_id, &msg, si
zeof(MSG) ‐ sizeof(long), 30, 0);3 msgrcv(msg_id, &msg,
sizeof(MSG) ‐ sizeof(long), 接收感兴趣的类型值, 0);00_bob。c负责发送
消息1 #include <stdio。h>2 #include <sys/types。h>3 #includ
e <sys/ipc。h>4 #include <sys/msg。h>5 #include <string。h
>6 //定义一个消息类型结构7 typedef struct MyStruct8 {9 long mtype
; //消息类型1011 char mtext[64]; //消息正文12 char name[32]; //
发送者的姓名13 } MSG;14 int main(int argc, char const *argv[]
)15 {16 //获取IPC的唯一KEY值17 key_t key = ftok("/", 2021);18
printf("key=%#x\n", key);1920 //创建一个消息队列21 int msg_id
= msgget(key, IPC_CREAT | 0666);22 printf("msg_id=%d\n"
, msg_id);2324 //发送消息 给lucy‐‐20发消息25 MSG msg;26 memset(
&msg, 0, sizeof(msg));27 msg。mtype = 30;28 strcpy(msg。n
ame, "bob");29 strcpy(msg。mtext, "hello msg");30 msgsnd
(msg_id, &msg, sizeof(MSG) ‐ sizeof(long), 0);3132 retu
rn 0;33 }00_lucy。c负责接收lucy--20的消息1 #include <stdio。h>2
#include <sys/types。h>3 #include <sys/ipc。h>4 #include
<sys/msg。h>5 #include <string。h>6 //定义一个消息类型结构7 typedef
struct MyStruct8 {9 long mtype; //消息类型1011 char mtext[
64]; //消息正文12 char name[32]; //发送者的姓名13 } MSG;14 int ma
in(int argc, char const *argv[])15 {16 //获取IPC的唯一KEY值17
key_t key = ftok("/", 2021);18 printf("key=%d\n", key)
;1920 //创建一个消息队列21 int msg_id = msgget(key, IPC_CREAT|0
666);2223 //接收消息24 MSG msg;25 memset(&msg, 0, sizeof(ms
g));26 msgrcv(msg_id, &msg, sizeof(MSG)‐sizeof(long), 2
0, 0);27 printf("发送者:%s\n", msg。name);28 printf("消息:%s\
n", msg。mtext);293031 return 0;32 }00_tom。c负责接收消息1 #inc
lude <stdio。h>2 #include <sys/types。h>3 #include <sys/i
pc。h>4 #include <sys/msg。h>5 #include <string。h>6 //定义一
个消息类型结构7 typedef struct MyStruct8 {9 long mtype; //消息类型
1011 char mtext[64]; //消息正文12 char name[32]; //发送者的姓名13
} MSG;14 int main(int argc, char const *argv[])15 {16
//获取IPC的唯一KEY值17 key_t key = ftok("/", 2021);18 printf(
"key=%d\n", key);1920 //创建一个消息队列21 int msg_id = msgget(
key, IPC_CREAT | 0666);2223 //接收消息24 MSG msg;25 memset(
&msg, 0, sizeof(msg));26 msgrcv(msg_id, &msg, sizeof(MS
G) ‐ sizeof(long), 30, 0);27 printf("发送者:%s\n", msg。nam
e);28 printf("消息:%s\n", msg。mtext);2930 return 0;31 }绝对
能收到6、消息队列的控制1 #include <sys/msg。h>2 int msgctl(int msqi
d, int cmd, struct msqid_ds *buf);3 功能:4 对消息队列进行各种控制,如修
改消息队列的属性,或删除消息消息队列。5 参数:6 msqid:消息队列的标识符。7 cmd:函数功能的控制。
8 buf:msqid_ds数据类型的地址,用来存放或更改消息队列的属性。9 cmd:函数功能的控制10 IP
C_RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关数据结构。11 IPC_STAT:将m
sqid相关的数据结构中各个元素的当前值存入到由buf指向的结构中。12 IPC_SET:将msqid相关的数
据结构中的元素设置为由buf指向的结构中的对应值。13 返回值:成功:返回 0;失败:返回 ‐17、消息队列的
练习消息队列实现多人聊天程序。1 typedef struct msg2 {3 long type; //接收
者类型4 char text[100]; //发送内容5 char name[20]; //发送者姓名6 }M
SG;每个程序都有两个任务,一个任务是负责接收消息,一个任务是负责发送消息,通过fork创建子进程实现多任务。
一个进程负责接收信息,它只接收某种类型的消息,只要别的进程发送此类型的消息,此进程就能收到。收到后通过消息的
name成员就可知道是谁发送的消息。 另一个进程负责发信息,可以通过输入来决定发送消息的类型。 设计程序的时候
,其它人收不到。这样就是实现了给特定的人发送消息



Disclaimer: The above articles are added by users themselves and are only for typing and communication purposes. They do not represent the views of this website, and this website does not assume any legal responsibility. This statement is hereby made! If there is any infringement of your rights, please contact us promptly to delete it.

字符:    改为:
去打字就可以设置个性皮肤啦!(O ^ ~ ^ O)