1. 正确选择触发模式(ET 和 LT)
-
水平触发(LT) :默认模式,只要文件描述符处于就绪状态,
epoll_wait
会持续通知。适合大多数场景,编程简单。 -
边缘触发(ET):只在状态变化时通知一次,适合高性能场景,但需要确保一次性处理完所有数据,否则可能丢失事件。
-
注意:
-
在 ET 模式下,必须循环读取或写入数据,直到返回
EAGAIN
或EWOULDBLOCK
。 -
如果未处理完数据,
epoll_wait
不会再通知,可能导致事件丢失。
-
2. 正确处理事件
-
事件类型:
-
EPOLLIN
:数据可读。 -
EPOLLOUT
:数据可写。 -
EPOLLERR
:发生错误。 -
EPOLLHUP
:对端关闭连接。
-
-
注意:
-
必须处理
EPOLLERR
和EPOLLHUP
事件,否则可能导致程序异常。 -
在
EPOLLIN
事件中,确保读取所有数据(特别是在 ET 模式下)。 -
在
EPOLLOUT
事件中,避免频繁触发(可以通过动态添加/删除EPOLLOUT
事件来优化)。
-
3. 文件描述符管理
-
添加/修改/删除文件描述符:
-
使用
epoll_ctl
的EPOLL_CTL_ADD
、EPOLL_CTL_MOD
和EPOLL_CTL_DEL
操作。 -
确保文件描述符有效,避免重复添加或遗漏删除。
-
-
注意:
-
文件描述符关闭后,必须从
epoll
实例中删除,否则可能导致未定义行为。 -
在多线程环境中,文件描述符的管理需要加锁保护。
sqlite3:
sqlite3 xxx.db
- sqlite的命令
.help 查询手册
.tables 查看数据库中的表
.headers on/off 打开/关闭表头
.mode column 设置左对齐
.quit 退出数据库
- 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 表名;
- sqlite提供的C API接口
-