一、宏
1.定义
#define是C语言中的一个宏定义,用来建一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本 例如:#define PI 3.1415926 #define A(x) x
2.宏替换
编译预处理是实现以下功能
文件包含:把源文件中的#include扩展为文件正文 条件编译:预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中某部分包含进来或者排除在外,通常把排除在外的语句转换成空行 宏展开:预编译器将源程序文件中出现的对宏的引用展开成相应的宏定义,也就是本文所说的#define的功能,由预处理器来完成
3.三种特殊用法
二、size_t
1.size_t类型
在32位系统中size_t是4字节的,在64系统中size_t是8字节的,增强了该类型的可移植性 定义
typedef unsigned log kernal_size_t ;
typedef int unsigned __kernal_size_t;
注意点:无符号的类型和有符号的类型进行比较的时候,有符号的类型会先转换为无符号,例如-1装换成无符号的就是4294967295
三、epoll函数
为了处理高并发的场景而设计的 引子问题:如果有成千上万个客户端是和服务器相连的,但是实际上保持活跃的也就那么几千几百个,所以成千上百空余的链接都是没有没用的,造成计算资源的浪费。 epool通过在linux内核中申请一个简易的文件系统把原来的select/poll调用分为三个部分:
调用epoll_create建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源) 调用epoll_ctl向epoll对象中添加这个成千上万个连接的Socket 调用epoll_wati收集发生的事件的连接 通过这种机制,只需要在进程启动的时候建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。
四、编译宏
int eap_register_methoed ( void )
{
int ret = 0 ;
# ifdef EAP_MD5
if ( ret == 0 )
ret = eap_peer_md5_register ( ) ;
# endif
. . .
# ifdef EAP_SERVER_MD5
if ( ret == )
ret = eap_server_md5_register ( ) ;
# endif
. . .
return ret;
}
五、select与epoll函数
指标 select epoll 性能 随着连接户数量的增减,急剧下降,处理成千上万并发链接的时候,性能很差 随着链接数量的增阿基,性能基本没有下降,处理成千上万并发的时候洗能呢很好 连接数 连接数有限制,处理嘴大链接数不超过1024,如果超过这个数字,就要修改FD_SETSIZE宏,并进行重新编译 连接数没有限制 实现方式 线性轮询 回调callBak 开发复杂性 低 高
调用过程
参考:一文搞懂select、poll和epoll区别
六、源码
gitee路径:https://gitee.com/dongqianrui/AndroidStudioProject/tree/master/Test1 CSDN:https://blog.csdn.net/weixin_44630050 博客园:https://www.cnblogs.com/ruigege0000/ 欢迎wxgzh:傅里叶变换,个人账号,仅用于技术交流