java的消息队列,java 进程间通信
00-1010消息队列1。消息队列2的原理。消息队列的接口33602.1创建消息队列2.2向消息队列发送消息2.3接收消息:2.4操作消息队列接口2.5代码测试:信号量总结3360信号量原理
目录
消息队列
1.1 msgqueue使用链表实现消息队列,由系统内核维护。1.2系统中可能有很多msgqueues,每个MQ都用消息队列描述符(消息队列ID 3360QID)来区分,消息队列描述符是唯一的,用来区分不同的MQ。1.3进程间通信时,一个进程将消息添加到MQ的末尾,另一个进程从消息队列中取出消息(可以使用先进先出消息,也可以根据消息类型取出消息),从而实现进程间通信。
1.消息队列的原理
2.消息队列的接口:
int msgget(key_ t key,int msgflg);
参数:
消息队列的标识符msgflg:创建一个标志,比如IPC _ CREATIPC _ CREAT3360。如果它不存在,创建它:按位或前一个权限(八进制数)返回值: .
成功:返回队列ID失败3360返回-1并设置erron。
2.1创建消息队列
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
参数:
Msgid:消息队列IDmsgp:指向msgbuf的指针,用于指定要发送的消息。操作系统已经为该函数发送的消息定义了发送格式,但只定义了一部分,另一部分需要程序员自己定义。
Msgsz:要发送的消息的长度,消息内容的长度msgflg:创建一个标签,如果指定了IPC_NOWAIT,失败会立即返回0:阻塞发送IPC_NOWAIT:非阻塞发送返回值:.
成功:返回0失败:返回-1并设置错误。
2.2向消息队列发送消息
ssize_t msgrcv(int msqid,void *msgp,sizet msgsz,long msgtyp,int msgflg);
参数:
Msgid:消息队列IDmsgp:指向msgbuf的指针,用于接收消息msgsz:要接收的消息的长度注:参数msgsz指定msgp参数所指向的结构的成员mtext的最大大小(以字节为单位)msgtyp:接收消息的方式 。
1.msgtyp=0:读取队列中的第一条消息(不要管当前header元素是什么消息类型,当作普通队列处理)2。读取队列中msgtyp类型的第一条消息。(即读取列元素中的第一根香蕉)除非msgflg中指定了MSG_ EXCEPT,否则会读取第一条类型不等于msgtyp绝对值的消息。3.读取队列中最小类型小于或等于msgtyp绝对值的第一条消息。msgflg:创建一个标志,如果指定了IPC_ NOWAIT,将立即返回采集失败。
返回值:
成功返回实际读取消息的字节数,如果失败则返回-1,并设置erron。
2.3接收消息:
int msgctl(int msqid,int cmd,struct msqid _ ds * buf);
参数:
msqid:消息队列IDcmd:控制命令,如IPC_ RMID、delete命令、IPC STAT,并获取状态buf:其中存储了消息队列相关信息的buf返回值:。
成功根据不同cmd有不同的返回值,失败为-1,设置erron。
00-1010创建消息对列,编写器发送消息对列,读取器读取消息对列的内容。
我们运行写端代码两次,发现在消息对列中写入了20条消息,
运行阅读器代码,我们发现它被成功地读出。
运行三次后,可以发现不能从消息对列中读取,也就是说消息对列每得到一条消息,就会将消息对列中对应的消息出队。
2.4操作消息队列的接口
00-1010信号量本质上是一个资源计数器,可以保证多个进程访问临界资源,并且在临界区执行代码时互斥访问。同时,它还可以用于同步关键资源:可以被多个进程访问的资源(例如,同一块内存中的:)。访问临界资源时的临界区3360的代码称为临界区。
互斥访问:同时,多个进程中,只有一个进程可以访问临界区资源。当多个资源被信号量互斥时,需要先获取信号量。如果您可以获得正确数量的信息,您就可以访问关键资源。不能的话就堵着等。等待进程将信号量设置为1,然后访问。
如果不做互斥访问,结果会很模糊。(结果不同)(多核cpu同时运行多个进程访问关键资源,单核抢占式执行,操作系统的调度不可控)同步3360当关键资源空闲时,通知等待的进程访问。
2.5代码测试:
本文到此为止。希望它能帮到你,也希望你能多关注更多的盛行它的内容!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。