fd

day34-2 多路复用之epoll

。_饼干妹妹 提交于 2020-01-19 07:54:28
epoll select存在的问题 select,需要遍历socket列表,频繁的对等待队列进行添加移除操作 数据到达后还需要遍历所有的socket才能获知哪些socket有数据 两个操作消耗的时间随着要监控的socket的数量增加而大大增加,所以最大只能监视1024个socket。 于是就推出了epoll,epoll对问题一方案是把等待队列的维护与阻塞进程这两个操作分开了 对问题2是自己维护了一个等待队列,避免了遍历所有的socket。需要注意:epoll仅能在linux中使用 epoll相关函数 import select # 导入select模块 epoll = select.epoll() # 创建一个epoll对象 epoll.register(文件句柄,事件类型) # 注册要监视的文件句柄和事件 # 事件类型: select.EPOLLIN # 可读事件 select.EPOLLOUT # 可写事件 select.EPOLLERR # 错误事件 select.EPOLLHUP # 客户端断开事件 epoll.unregister(文件句柄) # 销毁文件句柄 epoll.poll(timeout) # 当文件句柄发生变化,则会以列表的形式主动报告给用户进程,timeout为超时时间,默认为-1,即一直等待直到文件句柄发生变化,如果指定为1

CAN FD协议分析

≡放荡痞女 提交于 2020-01-19 03:57:20
在汽车领域,随着人们对数据传输带宽要求的增加,传统的CAN总线由于带宽的限制难以满足这种增加的需求。此外为了缩小CAN网络(max. 1MBit/s)与FlexRay(max.10MBit/s)网络的带宽差距,BOSCH公司推出了CAN FD 。 CAN FD(CAN with Flexible Data rate)继承了CAN总线的主要特性。CAN总线采用双线串行通讯协议,基于非破坏性仲裁技术,分布式实时控制,可靠的错误处理和检测机制使CAN总线有很高的安全性,但CAN总线带宽和数据场长度却受到制约。CAN FD总线弥补了CAN总线带宽和数据场长度的制约,CAN FD总线与CAN总线的区别主要在以下两个方面: ? 可变速率 CAN FD采用了两种位速率:从控制场中的BRS位到ACK场之前(含CRC分界符)为可变速率,其余部分为原CAN总线用的速率。两种速率各有一套位时间定义寄存器,它们除了采用不同的位时间单位TQ外,位时间各段的分配比例也可不同。 ? 新的数据场长度 CAN FD对数据场的长度作了很大的扩充,DLC最大支持64个字节,在DLC小于等于8时与原CAN总线是一样的,大于8时有一个非线性的增长,所以最大的数据场长度可达64字节。 CAN FD介绍 1.CAN FD 数据帧帧格式 CAN FD 数据帧在控制场新添加EDL位、BRS位、ESI位,采用了新的DLC编码方式

Linux下操作GPIO

自作多情 提交于 2020-01-19 00:09:37
背景 嵌入式Linux下需要经常操作GPIO管脚,其中一种方式是使用/sys/文件系统下内核暴露出来的gpio文件。 代码 # include <stdio.h> # include <string.h> # include <stdlib.h> # include <termios.h> # include <sys/time.h> # include <sys/types.h> # include <unistd.h> # include <sys/stat.h> # include <fcntl.h> int set_gpio_val ( int gpio , int val ) { int fd = - 1 ; char buf [ 64 ] = { 0 } ; /* export */ fd = open ( "/sys/class/gpio/export" , O_WRONLY ) ; if ( fd < 0 ) { printf ( "/sys/class/gpio/export open error\n" ) ; return - 1 ; } sprintf ( buf , "%d" , gpio ) ; write ( fd , buf , 3 ) ; close ( fd ) ; /* set direction: in or out */ memset (

Linux下操作串口

蓝咒 提交于 2020-01-18 22:41:30
背景 嵌入式Linux开发,绕不开串口操作。 代码 # include <stdio.h> # include <string.h> # include <stdlib.h> # include <termios.h> # include <sys/time.h> # include <sys/types.h> # include <unistd.h> # include <sys/stat.h> # include <fcntl.h> int main ( ) { int fd = - 1 ; struct termios options ; struct timeval timeout ; fd_set readfd ; int ret = - 1 ; char data = 0 ; /* open */ fd = open ( "/dev/ttyS2" , O_RDWR | O_NOCTTY | O_NDELAY ) ; if ( fd < 0 ) { printf ( "open serial device error" ) ; return - 1 ; } /* get parameters */ if ( tcgetattr ( fd , & options ) != 0 ) { printf ( "tcgetattr error\n" ) ; return - 1 ;

epoll 模板

一笑奈何 提交于 2020-01-18 08:10:45
select 的问题: 1.当进程被唤醒不清楚到底哪个socket有数据,只能遍历一遍 2.每一次select的执行,都需要将这进程,再加入到等待队列中 ​ 为了防止重复添加等待队列,当某一次操作完成时,也必须从等待队列中删除进程 所以select最大限制被设置为了1024 ,如此看来select连多线程都比不上 于是推出了poll 和 epoll poll只是简单对select进行了优化,但是还不够完美 ,epoll才是最后的解决方案 注意:epoll仅能在linux中使用 案例: import socket import select s = socket.socket() s.bind(("127.0.0.1",1689)) s.listen() # 创建一个epoll对象 epoll = select.epoll() # 注册读就绪事件 (有数据可以读取了) # s.fileno()用于获取文件描述符 epoll.register(s.fileno(),select.EPOLLIN) # 存储文件描述符与socket的对应关系 fd_sockets = {s.fileno():s} while True: # 该函数是阻塞会直到你关注的事件发生 # 返回值为文件描述符与发生的事件类型 是一个列表 列表中是元组 第一个是描述符 第二个是事件 for fd,event in

libev 源码解析

Deadly 提交于 2020-01-17 06:03:03
一 libev简介   libev是一个轻量级的事件通知库,具备支持多种事件通知能力,通过对libev的源码的阅读,可以清楚了解事件通知实现内部机制。 二 核心数据结构 在libev中关键的数据结构是,loop结构体,该结构体定义的字段较多,但是主要核心的可以分为两大类 ev_loop结构体(loop为ev_loop结构的全局变量)的字段定义在ev_vars.h头文件中,然后在ev.c中通过include的方式导入 1.各类事件的watcher集合  loop中有支持很多类型的事件,如下 ev_io // IO可读可写 ev_stat // 文件属性变化 ev_signal // 信号处理 ev_timer // 相对定时器 ev_periodic // 绝对定时器 ev_child // 子进程状态变化 ev_fork // fork事件 ev_cleanup // event loop退出触发事件 ev_idle // event loop空闲触发事件 ev_embed // 嵌入另一个后台循环 ev_prepare // event loop之前事件 ev_check // event loop之后事件 ev_async // 线程间异步事件 这些事件的监控管理都对应一种类型的watcher数组,比如 (loop)->anfds :维护所有fd事件 (loop)-

nodeJS中读写文件方法的区别

陌路散爱 提交于 2020-01-17 04:35:40
导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法,针对写操作为我们提供了writeFile,write, createWriteStream三个方法,下面分析一下它们的区别: 一、readFile和writeFile 1、readFile方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容,具体操作如下: fs.readFile('./test.txt', 'utf8', function(err, data){ console.log(data); }); 与其对应的同步方法为: var data = fs.readFileSync('./test.txt', 'utf8'); console.log(data); 同步方法和异步方法的区别是:在使用同步方法执行的操作结束之前,不能执行后续代码的执行;而异步方法将操作结果作为回调函数的参数进行返回,方法调用之后,就可以立即执行后续的代码,读取完毕后会调用对应的回调函数。 2、writeFile方法是将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中,其同步和异步具体操作如下: //异步方法 fs.writeFile('./message

进程间通信(IPC)

流过昼夜 提交于 2020-01-17 01:03:50
进程间通信(Interprocess communication) 一、概述: 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。进程间通信是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。 二、目的: (1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 (2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 (3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 (4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 (5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux支持多种进程间通信(IPC)机制

Linux下串口编程入门

*爱你&永不变心* 提交于 2020-01-16 18:47:11
简介:   Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍。 串口简介   串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50英尺。   Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《Serial Programming Guide for POSIX Operating Systems》 串口操作   串口操作需要的头文件 #include <stdio.h> /*标准输入输出定义*/ #include <stdlib.h> /*标准函数库定义*/ #include <unistd.h> /*Unix 标准函数定义*/ #include <sys/types.h>

nginx 内存池

谁说我不能喝 提交于 2020-01-16 11:22:43
目录 简述 几种数据结构 对外的方法 总结 参考 https://www.cnblogs.com/xiekeli/archive/2012/10/17/2727432.html?tdsourcetag=s_pctim_aiomsg 源码版本 nginx-1.12.2 简述 nginx 是一个http , 反向代理等的服务器,以其高效,稳定,低内存闻名。最具特点的是它不是以线程方式处理请求,而是采用了一种事件驱动异步架构的方式。这也就要求 整个内存池可以看作是由一个个内存块组成的链表。 几种数据结构 对外的方法 ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log);//创建内存池 void * ngx_palloc(ngx_pool_t *pool, size_t size);//内存申请(对齐) void * ngx_pnalloc(ngx_pool_t *pool, size_t size);//内存申请(不对齐) void * ngx_pcalloc(ngx_pool_t *pool, size_t size);//内存申请,并初始化为0 ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);//释放内存 void ngx_reset_pool(ngx_pool_t *pool)