首页
学习
活动
专区
圈层
工具
发布

linux网络编程之System V 消息队列(二):消息队列实现回射客户服务器和 msgsnd、msgrcv 函数

把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由msgget...返回值:成功返回0;失败返回-1 msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误。...功能:是从一个消息队列接收消息 原型 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 参数...长整型 msgtype:它可以实现接收优先级的简单形式 msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事 返回值:成功返回实际放到接收缓冲区里去的字符个数,失败返回-1 msgtype...二、消息队列实现回射客户/服务器 在前面的系列文章中,我们都是使用socket 套接字来实现回射客户/服务器程序,现在尝试使用消息队列来实现,主要就是利用上面介绍的两个函数msgsnd,msgrcv 。

1.8K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    消息队列应用场景&&ActiveMQ消息发送失败的处理方案

    今天我们来介绍一下ActiveMQ消息队列消息发送失败的处理方案。     在介绍今天的内容之前,首先我们来探讨一下为什么要用MQ。 企业中系统为什么要用消息队列那?...使用消息队列MQ,大致解决三类问题:      (1)系统解耦        假设你有个系统 A,这个系统 A 会产出一个核心数据,现在下游有系统 B 和系统 C 需要这个数据。...接下来,我们探讨一下ActiveMQ消息队列消息发送失败的处理方案    这个问题与其讨论MQ消息队列消息发送失败的解决方案,等同于探讨中间件如何保证消息的一致性的问题?...可以单独抽离出来一个服务器安装数据库,任何主动方都是通过数据源连接这个数据库,给数据源一个IP地址就可以连接这个数据库)       然后执行生产者的业务代码时:                  ——–>如果失败...那么之前插入数据库中那条数据还是处于待发送状态,如果数据丢失,消费方无法接收信息,生产者有个定时任务,会不断去数据库找状态为待发送的那条记录,如果找到待发送这条数据就再次把信息发到MQ,因为不会无限次数发送,因此如果发送6次均为失败就会转人工客服

    1.7K10

    Linux消息队列及函数

    ftok(char *pathname, char proj); 获取成功返回消息队列的键值,失败返回-1。...在以下两种情况下,msgget()将创建一个新的消息队列: 如果没有消息队列与键值key相对应,且msgflg中包含了IPC_CREAT标志位 key参数为IPC_PRIVATE 消息队列的读写 消息队列传递的消息由两部分组成...参数msqid为消息队列的引用标识符(ID),参数prt为void型指针,指向要发送到的消息,参数nbytes为发送的消息的字节长度,参数flag用于指定消息队列满时的处理方法。...参数含义与msgsnd()函数类似,参数flag用于指定消息队列满时的处理方法,取值有3种以及3种的或结果,参数type表示接收的数据类型。...函数msgctl()将对参数msqid标识的消息队列执行参数cmd所指的命令,包括3种命令: IPC_STAT:用于获取消息队列信息,返回的信息存贮在**参数buf**中 IPC_SET:用于设置消息队列的属性

    5.2K20

    【Linux系统】进程间通信-System V消息队列

    msgflag参数 IPC_NOWAIT:如果消息队列已满,则立即返回,而不是阻塞等待。 0:默认行为,如果消息队列已满,则阻塞等待,直到消息被发送或超时。...msgtyp参数 消息的类型,用于选择性接收消息: 0 收队列中第一个消息。...正整数 接收类型等于 msgtyp 的消息 负整数 接收类型小于或等于 abs(msgtyp) 的消息 通过这个参数,可以设置优先级,看先读取哪个,如果失败,再读取哪些。...msgflag参数 IPC_NOWAIT:如果队列中没有符合条件的消息,则立即返回,而不是阻塞等待。...失败:返回 -1,并设置 errno 以指示错误。 MsgQueue类封装 对于客户端,只进行消息队列的获取,不进行创建,而服务端确确实实要进行创建一个新的消息队列。

    26810

    Linux系统编程-进程间通信(消息队列)

    msgget要么返回新创建的消息队列id,要么返回具有相同key值的消息队列id;如果IPC_EXCL和IPC_CREAT同时指明,则要么创建新的消息队列,要么当队列存在时,调用失败并返回-1。...失败返回-1,errno被设为以下的某个值。...参数 (1)msgid:指明消息队列的ID; 通常是msgget函数成功的返回值。...参数 (1)msqid:由msgget返回的消息队列标识符。 (2)cmd:通常为IPC_RMID表示删除消息队列。 (3)参数buf通常为NULL。...案例代码: 消息队列基本使用 下面两个例子,一个例子用于创建队列,并向队列里写数据,另一个例子从队列里读取数据。 4.1 向队列写入消息 程序运行需要传入两个额外的参数。

    2.1K40

    Linux内核编程--消息队列

    ,例如 IPC_CREAT 返回:若成功,返回消息队列的ID,若失败,返回-1。...msgsnd:将新消息添加到队列末尾 #include #include #include int msgsnd(int msgid...msgsnd()会将msgp指向的消息结构体复制一份出来,追加到msgid指定的消息队列中。如果消息队列没有被塞满,msgsnd()会立即返回,如果消息队列已满,则函数会阻塞直到有空间可用。...也可以在参数msgflg中加入IPC_NOWAIT,让msgsnd()从阻塞模式变为异步模式,如果消息队列已满,则报错返回。...oflag参数常见取值: O_RDONLY--以只接收消息的形式打开消息队列 O_WRONLY--以只发送消息的形式打开消息队列 O_RDWR--以可接收可发送的形式打开消息队列 还有O_CREAT,

    5.1K20

    【Linux】消息传递的艺术:探索Linux消息队列机制

    返回值 成功:返回消息队列的标识符msgid。 失败:返回-1。 是不是和shmget相似,简直一模一样啊!...对于 IPC_STAT 和 IPC_SET,需要使用此参数;对 IPC_RMID 则可以为 NULL。 返回值 成功返回0,失败返回-1 只是释放消息队列,函数的使用就是套路了。...msgctl(msqid,IPC_RMID,nullptr); 1.4.2 使用消息队列 发送消息 为了将数据发送到消息队列,现在需要的函数为msgsnd msgsnd 是用于向 System V..., size_t msgsz, int msgflg); 参数说明: msqid 消息队列的标识符,由 msgget 返回。...失败:-1 关于参数2 表示的是待发送的数据块,是一个结构体剋们需要自己定义 struct msgbuf { long mtype; /* message type, must

    76610

    【Linux】systemV消息队列和信号量

    msgid:消息队列标识符,msgget函数返回值 cmd:msgctl函数的cmd参数常用命令如下: 命令 说明 IPC_STAT 获取消息队列的状态信息,将信息存储在buf指向的msqid_ds...结构体的指针,用于存储或提供消息队列的相关信息,msqid_ds结构包含了消息队列的各种属性,如队列的权限、所有者信息、消息队列的大小等 (三)发送消息 msgsnd用于向消息队列发送消息的系统调用函数...msgflg:该位置为0就是不设置 函数 msgflg 作用 示例 msgsnd IPC_NOWAIT 非阻塞发送消息,当消息队列已满,无法立即发送消息时,如果设置了该标志,msgsnd 函数会立即返回...-1,errno 被设置为 EAGAIN;若未设置该标志,msgsnd 函数会阻塞,直到消息队列有空间可以发送消息 msgsnd(msgid, &msgbuf, sizeof(msgbuf.mtext...,不包括最前面的long 前两个参数与前面相同 msgsz:接收消息时用于存储消息数据部分的缓冲区的最大长度 msgtyp:如果等于0,那该函数只接收消息队列中的第一条消息,如果大于0,接收消息队列中消息类型为

    26410

    Linux进程间通信(上)之管道、消息队列实践

    3.2、msgsnd函数 该函数用来向消息队列发送一个消息。...对发送的消息来说,有意义的msgflg标准为IPC_NOWAIT,指明在消息队列没有足够的空间容纳要发送的消息时,msgsnd是否等待。...造成msgsnd()等待的条件有两种:当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;当前消息队列的消息数不小于消息队列的总容量,此时,虽然消息队列中的消息数目并不多,但基本上都只有一个字节...调用成功的时候返回0,失败返回-1. 3.3、msgrcv函数 该函数用来从一个消息队列获取消息。...当调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区中,然后删除消息队列中对应的消息;失败则返回-1. 3.4、msgctl函数 该函数用来控制消息队列。

    2.6K10

    进程间通讯(五).message queue(2)

    如果不指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。如果一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。...MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。如果不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。...当消息从队列内取出后,相应的消息就从队列中删除了。...函数调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msgp指向的用户分配的缓存区中,然后删除消息队列中的对应消息; 失败时返回-1 ---- msgctl msgctl 的原型定义在 sys...,仍在使用这一队列的进程在下次对队列进行操作时会出错返回 函数成功时返回0,失败时返回-1 ---- msqid_ds 在 bits/msq.h 中有关于 msqid_ds 的定义 /* Structure

    93420

    Linux系统编程——进程间通信:消息队列

    参数: key: ftok() 返回的 key 值 msgflg: 标识函数的行为及消息队列的权限,其取值如下: IPC_CREAT:创建消息队列。...参数: msqid: 消息队列的标识符。 msgp: 待发送消息结构体的地址。 msgsz: 消息正文的字节数。...一旦接收消息成功,则消息在消息队列中被删除。 参数: msqid:消息队列的标识符,代表要从哪个消息列中获取消息。 msgp: 存放消息结构体的地址。 msgsz:消息正文的字节数。...返回值: 成功:读取消息的长度 失败:-1 消息队列的控制 所需头文件: #include int msgctl(int msqid, int cmd, struct msqid_ds...参数: msqid:消息队列的标识符。 cmd:函数功能的控制。其取值如下: IPC_RMID:删除由 msqid 指示的消息队列,将它从系统中删除并破坏相关数据结构。

    1.6K10

    Laravel 消息队列的优先级和失败任务重试实现

    上篇教程发布后,有同学反馈消息队列的优先级怎么实现,Laravel 本身对此提供了支持,除此之外,Laravel 的队列组件还支持批处理、延迟推送、失败任务处理、消息队列中间件、频率限制等很多特性,一篇教程根本介绍不完...,毕竟消息队列也是个很复杂的系统,但是放到这里来讲似乎又偏离了 Redis 这个主题,所以这里学院君先给大家简单介绍下消息队列优先级和失败任务处理的实现,至于更多功能特性,后面单独开一个消息队列专题进行系统介绍...队列优先级 我们可以推送任何任务作为消息数据到队列系统,但是不同任务的优先级是不同的,比如一个订单支付任务的优先级肯定是要高于文章浏览数更新这种一般任务,那么如何让队列按照优先级处理不同任务呢?...实现消息队列的负载均衡 但是这也会引出另一个问题 —— 如果 payment 队列负载较高,一直处理繁忙状态,那么 default 队列中的任务就会一直阻塞,没有机会执行,为了解决这个问题,一种方案是多开几个同样的处理进程...失败任务重试 基于 Webhook 推送消息到其他应用 以上演示的都是同一个应用内部的消息数据推送,此外,我们还可以借助 Webhook 实现不同应用之间的消息推送。

    2.8K20

    【Linux】责任链模式和消息队列

    参数: key:某个消息队列的名字 msgflg:由九个权限标志构成,其用法和创建文件时使用的 mode 模式标志一样 返回值 成功时返回一个非负整数,即该消息队列的标识符。...参数: msgid:由 msgget 函数返回的消息队列标识码 cmd:将要采取的动作(有三个可取值),分别如下: 命令 说明 IPC_STAT 把 msqid_ds 结构中的数据设置为消息队列的当前关联值...buf:属性缓冲区 返回值 成功时返回 0,失败返回 -1 3. msgsnd NAME msgrcv, msgsnd - System V message queue operations...(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数: msgid:由 msgget 函数返回的消息队列标识码 msgp:是一个指针,指针指向准备...(msgflag=IPC_NOWAIT 表示队列为满不等待,返回 EAGAIN 错误) **返回值:**成功返回 0,失败返回 -1 关于消息主体 struct msgbuf { long mtype

    50910

    进程通信(二)消息队列(System V 消息队列)

    msgsnd函数 2.int msgsnd(int msqid, const void *ptr, size_t length, int flag); 参数msqid是由msgget返回的消息队列的唯一标识符...参数length:指定了由ptr指向的缓冲区中数据部分的大小,这是该函数能返回的最大数据量,该长度不包含整型类型字段。 参数type:指定希望从所给定的队列中读出什么样的消息。...参数flag:指定所请求类型的消息不在指定的队列中应该作何处理。 (1)0:阻塞接受消息 (2)IPC_NOWAIT:非阻塞接受消息,没有消息时,不阻塞。...msgctl的三个命令cmd参数: (1)IPC_RMID:从系统中删除由msqid指定的消息队列。此时第三个参数缺省省略,这个命令可以理解为删除消息队列。...(3)IPC_STAT,此时buff作为传出参数可以获取消息队列消息头中msg_perm结构体的在内核中的内容。

    3.1K20

    深入了解linux系统—— System V之消息队列和信号量

    消息队列的接口 1. msgget创建消息队列 int msgget(key_t key, int msgflg); 参数: key_t key:和共享内存的key一样,内核当做用来区别消息队列的标识符...返回值: 如果创建成功,就返回消息队列的唯一标识符; 认个错创建失败就返回-1,并且错误码被设置。 2. msgctl控制消息队列 首先,释放消息队列可以使用指令ipcrm -q....3. msgsnd发送信息 共享内存在使用时需要映射到进程的地址空间中,空间拿到起始虚拟地址,这样就可以拿着起始虚拟地址去访问共享内存了; 而消息队列不同,在进程中只能拿到消息队列的标识符,那要想发送和接受信息...,就只能通过系统调用; 发送信息用到的系统调用就是msgsnd 参数: int msqidid:消息队列的标识符,msgget的返回值。...这里注意:一般情况下msgsnd中的msgsz参数指的是我们要发送数据的大小,不算mtype标志位。

    21010
    领券