1.poll:
-
poll使用链表管理文件描述符,对监测的文件描述符没有上限限制。
-
文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝
-
需要应用层对集合表进行遍历,寻找到达的事件
-
只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)
2.epoll:
-
epoll使用树形结构(红黑树)管理文件描述符,提高查找效率
-
文件描述符集合创建在内核。避免了应用层和内核层的数据拷贝
-
向应用层返回到达的IO事件的结合,不需要遍历查找
-
可以工作在水平触发模式(低速模式),也可以工作在边沿触发模式(高速模式)
epoll的操作流程:
-
创建文件描述符集合 : epoll_create();
-
将关注的文件描述符加入到集合:epoll_ctl()
-
等待IO事件到达 : epoll_wait();
-
根据不同的IO事件处理不同的任务
函数接口:
- int epoll_create(int size);
功能:创建并打开一个epoll的文件描述符结合
参数:
size:最多允许监测的文件描述符个数
返回值:
成功:返回代表集合的文件描述符
失败:-1
- int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:对文件描述符集合进行操作
参数:
epfd:文件描述符集合
op:
EPOLL_CTL_ADD:向集合中添加
EPOLL_CTL_MOD:修改集合
EPOLL_CTL_DEL:从集合中删除
fd:要操作的文件描述符
event:事件的结构体
成功:0
失败:-1
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event {
uint32_t events; /* Epoll events */ //事件类型
epoll_data_t data; /* User data variable */
};
events:
EPOLLIN: 对文件描述符的读事件
EPOLLOUT:对文件描述符的写事件
data:
fd:操作的事件所对应的文件描述符
- int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
功能:开始监测IO事件,并返回监测到的结果
参数:
epfd:监测的文件描述符集合
events:保存epoll_wait监测到的到达事件的结果
maxevents:最多监测的事件个数
timeout:超时时间
-1:不设置超时
返回值:
成功:返回到达的IO事件的个数
失败:-1
0:超时时间到达但没有IO事件
数据库: 数据保存在外存上;程序运行结束时,掉电数据不丢失;是一个专业的管理数据工具
sqlite3:(小型的数据库)
1.sqlite常用的命令:
.help 查询手册
.tables 查看数据库中的表
.headers on/off 打开/关闭表头
.mode column 设置左对齐
.quit 退出数据库
2.sqlite支持的SQL(结构化序列语言)语言
数据类型:
INTEGER : 整形
REAL:浮点型
TEXT:文本字符串类型
NULL :空
- 创建一张表
create table 表名(列名1 数据类型, 列名2 数据类型, ....);
- 插入表格
insert into 表名 values(值1, 值2, 值3, ...);
- 查询数据库中的表
查询表中的所有数据:
select * from 表名;
查找指定列:
select 列名1,列名2 from 表名;
条件查找:
select * from 表名 where 列名 关系运算符 值;
关系运算符:
=
>
<
!=
>=
<=
or (||)
and (&&)
模糊查找:
select * from 表名 where 列名 like "%梅";
% : 可以匹配多个字符
_ : 只能匹配一个字符
有序查找:
升序查找:
select * from 表名 order by 列名 ASC;
降序查找:
select * from 表名 order by 列名 DESC;
- 删除数据
delete from 表名 where 条件;
- 修改数据
update 表名 set 列名=新值,列名=新值 where 条件;
- 删除表
drop table 表名