什么是消息队列 消息队列可以分为队列和消息 队列 队列是从开始到结束,有序的排放消息。消息队列是用来在应用程序发送消息,队列中存放了一些待处理的消息。...消息队列的基本结构是简单的,有一个客户端应用程序称为生产者,创建消息,并将它们传送到消息队列。其他应用程序,称为消费者,连接到队列,并得到要处理的消息。...消息队列API 创建新消息队列或取得已存在消息队列 #include ------------------------------------ int msgget(key_t...如果该队列已经存在,返回该队列ID.IPC_CREAT & IPC_EXCL: 如果该队列不存在创建,如果存在返回失败EEXIST....IPC_SET该命令用来设置消息队列的属性,要设置的属性存储在buf中。IPC_RMID从内核中删除 msqid 标识的消息队列。
通过调用windows\system32\mqoa.dll 这个Message Queuing ActiveX Interface API函数就可以做到; 下面...
前言 Linux 开发时,经常会遇到串口通信来完成两个设备之间的交互。...接收中断与超时判断: 当串口接收到数据时,会触发接收中断。...一旦接收到空闲中断,我们就可以认为已经接收到了一帧完整的数据。 接收中断 我们先理解下接收中断,当接收方接收到数据时,就会触发接收中断。 举例:某中断寄存器的如下图所示。...当发送FIFO(First In, First Out,先进先出队列)为空时,该位被设置,位值为 (1UL<<0),即二进制的 00000001。 UIS_TX_FIFO:发送FIFO中断。...tls_uart_write(TLS_UART_1, rx_fifo_buf, rx_len); // 发送 } } } } 小结 STM 32 串口通信功能在linux
对于UDP包来说,会被放到用户socket的接收队列中。 我们从上面这张图中已经从整体上把握到了Linux对数据包的处理过程。但是要想了解更多网络模块工作的细节,我们还得往下看。...如果有,那就通过sk_add_backlog把数据包添加到backlog队列。当用户释放的socket的时候,内核会检查backlog队列,如果有数据再移动到接收队列中。...sk_rcvqueues_full接收队列如果满了的话,将直接把包丢弃。接收队列大小受内核参数net.core.rmem_max和net.core.rmem_default影响。...上面我们说完了整个Linux内核对数据包的接收和处理过程,最后把数据包放到socket的接收队列中了。那么我们再回头看用户进程调用recvfrom后是发生了什么。...如果接收队列没有数据,进程就进入睡眠状态被操作系统挂起。这块相对比较简单,剩下大部分的戏份都是由Linux内核其它模块来表演了。 首先在开始收包之前,Linux要做许多的准备工作: 1.
接收数据(读) 从消息队列接收数据使用msgrcv()函数,函数原型如下: #include #include #include <sys/msg.h...若满足条件的消息内容大于请求的nbytes,则截断该消息,截断部分丢失 type取值 含义 type=0 接收消息队列中的第一条消息 type>0 接收消息队列中类型值等于type的第一条消息 type...<0 接收消息队列中类型值小于type的绝对值的所有消息中类型值最小的那一条消息 消息队列属性设置 消息队列的信息基本都保存在消息队列头中,可分配一个类似于消息队列头的结构struct msqid_ds...在另一个shell中运行消息队列接收程序: $ ....参考: 《精通Linux C编程》- 程国钢 《Linux C编程完全解密》- 闫敬 吴淑坤
一,关于Linux中的IPC IPC的意思是“ 进程间通信机制”,Linux内核有三种常用IPC对象可以拿来做进程间通信--消息队列,共享内存,信号量。...这三种IPC对象在Linux内核中都以链表的形式存储,它们都有特定的ID来标识(消息队列标识符msqid、共享内存标识符shmid,信号量标识符semid)。...消息队列与其他进程通信机制的比较: 与信号量相比,消息队列可以承载更多的通信数据。 与管道的默认接收相比,消息队列可以让接收进程有选择地接收通信数据,还可以设置接收的优先级。...msgget()返回消息队列ID后,后面的发生/接收操作都基于这个ID来进行。...oflag参数常见取值: O_RDONLY--以只接收消息的形式打开消息队列 O_WRONLY--以只发送消息的形式打开消息队列 O_RDWR--以可接收可发送的形式打开消息队列 还有O_CREAT,
linux snmptrap的发送与接收 由于需要管理服务器的一些参数,比如CPU使用率,IOwait之类的指标,管理方通过snmpwalk进行五分钟一次对受管服务器的轮询。.../$file”); while() { print HANDOUT “$_”; } 然后输入命令: Linux代码 snmptrapd -c /etc/snmp/snmptrapd.conf 将此配置文件设置为默认配置文件...,并启动snmptrapd进程: Linux代码 # snmptrapd -d -f -Lo 在受管方,使用命令: Linux代码 snmptrap -v 2c -c public 10.0.0.214...:162 “” .1.3.6.1.4.1.2021.251.1 sysLocation.0 s “this is test” 而后在管理方会接收到如下信息: Linux代码 Received 98 bytes....0 = OID: UCD-SNMP-MIB::ucdStart SNMPv2-MIB::sysLocation.0 = STRING: this is test 至此,最简单的snmptrap的发送与接收就完成了
int mdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int mdev_main(int...
这些看似杂乱无章的消息,通过消息队列发出来后,根据其发送的类型与发送的时间,在接收端中则是有规律的排序。 ? ? 如上图,内核中杂乱无章的消息,接收端可通过消息类型与发送的顺序来逐一接收处理。...可通过消息类型查看指定类型的消息,若指定类型为0,则按时间顺序输出所有接收到的消息。 接口 主要用到msgget、msgsnd、msgrcv和msgctl四个接口。...msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); msgsnd与msgrcv主要用于消息队列的发送与接收...实例演示 功能: 用消息队列实现server接client的数据,server可筛选显示指定消息类型的数据。 效果:server接收所有消息: ? server 筛选消息类型为2的数据: ?...送达:消息队列存储的消息,会一直保留在队列中直到消息被处理,且被取走后就会被队列释放。因此无论多少个进程在获取,每个消息仅会被处理一次。 排序:消息在队列中一直按照“先入先出”的顺序来执行。
这张图是在之前的文章用图之上修改而来,主要是添加了在TCP层所涉及到的队列。据说这叫重复利用。 这张图用来描绘内核从物理网卡以及虚拟网卡接收到网络包之后的数据流。...图 1:数据接收流程中的队列鸟瞰图 我们从左到右,从下至上,顺着网络包流过的路径,看看沿途中会碰到哪些队列。...其中prequeue队列在17年后的Linux版本中已经取消了,故本文略过这个队列。...把整个面向TCP连接的网络包接收处理流程稍作总结,我们会发现重要的参与者有如下几个: 网卡,包括物理的和虚拟的网卡:负责接收网络包。...为了可以高效地处理网络包,同时又可以让接收数据的各个重要组成模块以松耦合的方式合作,各式各样的队列参与了网络包的接收过程。
Linux进程通信之IPC消息队列 首先消息队列是存放消息的队列,而队列则是一种先进先出的数据结构。...key $key = ftok('demo21.php','a'); //创建消息队列 $msgId = msg_get_queue($key); //接收消息队列消息 msg_receive($msgId...父子进程消息队列通信 假设是子进程接收,父进程发送 $key = ftok('demo23.php','a'); //获取消息队列 $msgId = msg_get_queue($key);...while (1){ //接收消息队列信息 msg_receive($msgId,0,$type,1024,$msg); echo $msg."...再次执行 ipcs 查看,发现只剩我们上面测试的那一个消息队列,本次运行的消息队列已经清除成功 注意 当开启序列化时,如果发送的数据字节,小于接收数据的字节(msg_receive函数的第四个参数
当进程要获取某些资源(例如从网卡读取数据)的时候,但资源并没有准备好(例如网卡还没接收到数据),这时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。...waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用 add_wait_queue() 函数把进程添加到 waitqueue 中,然后切换到其他进程继续执行...等待队列初始化 要使用 waitqueue 首先需要声明一个 wait_queue_head_t 结构的变量,wait_queue_head_t 结构定义如下: struct __wait_queue_head...唤醒等待队列 当资源准备好后,就可以唤醒等待队列中的进程,可以通过 wake_up() 函数来唤醒等待队列中的进程。...--nr_exclusive) break; } } 可以看出,唤醒等待队列就是变量等待队列的等待进程,然后调用唤醒函数来唤醒它们。
前言 Linux系统给我们提供了一种可以发送格式化数据流的通信手段,这就是消息队列。...而内核给我们提供的消息队列,无疑大大方便了我们的工作。 Linux环境提供了XSI和POSIX两套消息队列,本文将帮助您掌握以下内容: 如何使用XSI消息队列。 如何使用POSIX消息队列。...使用msgsnd和msgrcv向队列发送和从队列接收消息。...这套消息队列在Linux 2.6.6版本之后开始支持,还需要你的glibc版本必须高于2.3.4。...,我们可以使用mq_send来对消息队列发送消息,mq_receive来对消息队列接收消息。
一,消息队列 1,概念:“消息队列”是在消息的传输过程中保存消息的容器 2,消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。 ...对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息; 对消息队列有读权限的进程则可以从消息队列中读走消息。 消息队列是随内核持续的。...(3)使用msgsnd( ) 发送消息 使用msgrcv( ) 接收消息 (4)使用msgctl( ) 删除消息队列 4,实例: sendmsg.c 用来发送消息的 // sendmsg.c..., NULL)) { perror("shmctl failed"); exit(2); } return 0; } recvmsg.c 用来接收消息的...2, // 取消息类型为2的消息 0); printf("类型:%d, 内容:%s\n", msg.mtype, msg.buf); printf("消息接收完成
今天就聊一聊Linux系统进程之间的通信。...标识符和Key 每个内核中的IPC结构(消息队列、信号量、共享内存)都用一个非负整数的标识符来进行调用。如,当使用消息队列发送或接收消息队列时,需要知道队列标识符。...接收效果: ? 运行发送程序,根据提示输入字符串,接收端会收到字符,输入end消息队列 终止。...三、小结 程序就是网上最流行的例子,做了微小的改动,下面想几个问题: ①发送和接收可以对同一个Key多次使用不同的进程访问么?如果可以效果是什么样的,一对多还是多对一?多次访问属于正常操作么?...②使用什么方式让发送端与接收端都知道Key值呢? ③下次具体介绍api时还有其他精彩的用法 参考书籍 《UNIX环境高级编程第三版》 阅读一手资料,多思考,还是挺好的。
消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。...消息队列中的每条消息通常具有以下属性: Ø 一个表示优先级的整数; Ø 消息的数据部分的长度; Ø 消息数据本身; 下面我们分别阐述POSIX消息队列和System V消息队列,这2种消息队列目前Linux...在Linux 2.6中该类型的定义为整型: #include typedef int mqd_t; // 关闭消息队列 mqd_t mq_close(mqd_t mqdes...下面是在Linux 2.6下shell对启动进程的POSIX消息队列大小的限制: [root@rocket ipc]# ulimit -a|grep message POSIX message queues...msgflg用于控制当队列中没有相应类型的消息可以接收时将发生的事情。
1 工作队列 Linux2.6版本中引入了工作队列概念,代替Linux2.4版本中的任务队列。用以实现注册激活某些函数,留待稍后由工作线程执行(与tasklet的处理类似)。...那么,当我们想要使用工作队列的时候,如何创建呢? 使用create_workqueue("foo")创建一个工作队列。foo是工作队列的名称,函数返回新创建的workqueue_struct的地址。...唤醒more_work等待队列中休眠的工作线程。 queue_delayed_work()函数与queue_work()类似,除了接收第3个参数-延时时间(单位是系统嘀嗒-tick)之外。...为了使用预定义工作队列,内核提供了一些辅助函数: 表4-14 预定义工作队列辅助函数 预定义工作队列函数 等价的标准工作队列函数 schedule_work(w) queue_work(keventd_wq...除了通用的events队列,在Linux2.6内核中还可以发现一些特定的工作队列。最重要的是kblockd工作队列,由阻塞设备层使用。 3 总结 工作队列的场合比较适用于驱动程序开发。
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲、队列有关的参数。...一旦数据包被成功接收,NIC发起中断,由内核的中断处理程序将数据包传递给IP层。经过IP层的处理,数据包被放入队列等待TCP层处理。...上面就是一个相当简化的数据包接收流程,让我们逐层看看队列缓冲有关的参数。...可以使用ethtool -g eth0查看当前Ring Buffer的设置: 上面的例子接收队列为4096,传输队列为256。...Input Packet Queue(数据包接收队列) 当接收数据包的速率大于内核TCP处理包的速率,数据包将会缓冲在TCP层之前的队列中。
Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。...图1 Linux内核接收网络包过程 理解了Linux工作原理之后,还有更重要的两件事情。第一是动手监控,会实际查看网络包接收的整体情况。...2)多队列网卡调优 现在的主流网卡基本上都是支持多队列的,我们可以通过将不同的队列分给不同的CPU核心来处理,从而加快Linux内核处理网络包的速度。这是最为有用的一个优化手段。...每一个队列都有一个中断号,可以独立向某个CPU核心发起硬中断请求,让CPU来poll包。通过将接收进来的包被放到不同的内存队列里,多个CPU就可以同时分别向不同的队列发起消费了。...我们用两篇文章详细讨论了Linux网络包的接收过程,以及这个过程中的一些统计数据如何查看,如何调优。
上一篇文章中《图解Linux网络包接收过程》,我们梳理了在Linux系统下一个数据包被接收的整个过程。...Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。...图1 Linux内核接收网络包过程 理解了Linux工作原理之后,还有更重要的两件事情。第一是动手监控,会实际查看网络包接收的整体情况。...2)多队列网卡调优 现在的主流网卡基本上都是支持多队列的,我们可以通过将不同的队列分给不同的CPU核心来处理,从而加快Linux内核处理网络包的速度。这是最为有用的一个优化手段。...每一个队列都有一个中断号,可以独立向某个CPU核心发起硬中断请求,让CPU来poll包。通过将接收进来的包被放到不同的内存队列里,多个CPU就可以同时分别向不同的队列发起消费了。
领取专属 10元无门槛券
手把手带您无忧上云