13. gdb
向makefile的所有编译过程加-g选项:make CXXFLAGS=-g
gdb调试,要求在所有文件编译过程中,加入-g选项。在文件数巨多的情况下,手动添加几乎不实际,特别是含有大量自动推导过程。
这时,无需修改makefile,直接运行make CXXFLAGS=-g,即可实现目的。
12. 查看信号
man 7 signal
11. 随机数
函数:void srand(unsigned int seed);
功能:设置随机数序列的种子
说明:种子相同,则调用rand()生成的随机数序列相同
函数:int rand();
功能:生成随机数
函数:time_t time(time_t *t);
功能:获取自Epoch经过的秒数
参数:存放返回结果,恒为NULL
10. 正则表达式
验证字符串格式:"yyyy-mm-dd hh:mm:ss"
函数:int regcomp(regex_t *prgx, const char *pattern, int flags);
功能:按照指定的模式创建正则表达式
参数:
regex_t *prgx:出参,即结果
const char *pattern:模式字符串
int flags:控制标志
控制标志:
REG_EXTENDED:使用POSIX扩展正则表达式,否则标准正则表达式。
REG_ICASE:忽略大小写
REG_NOSUB:不支持子串匹配
返回值:成功返回0,否则错误码
函数:int regexec(const regex_t *prgx, const char *obj_string, size_t nmatch, regmatch_t pmatch[], int flags);
功能:正则匹配
参数:
const regex_t *prgx:使用的正则表达式,由regcomp生成
const char *obj_string:待匹配字符串,目标字符串
size_t nmatch:pmatch元素个数,暂为0
regmatch_t pmatch[]:暂未使用,恒为NULL
int flags:标志位,未使用,暂为0
返回值:匹配成功返回0,否则返回REG_NOMATCH
函数:size_t regerror(int errcode, const regex_t *prgx, char *buffer, size_t buffer_size);
功能:根据错误码获取对应的错误信息
参数:
int errcode:错误码
const regex_t *prgx:发生错误的正则表达式
char *buffer:接收缓冲区
size_t buffer_size:接受缓冲区大小
返回值:返回buffer的实际使用大小
函数:void regfree(regex_t *prgx);
功能:释放prgx占用的空间
参数:待释放的regex_t结构体指针
9. UUID
依赖:yum install libuuid-devel
函数:void uuid_generate(uuid_t buuid);
功能:创建uuid,二进制格式uuid
参数:出参,uuid_t型变量,即结果
说明:函数生成uuid的方式,或者/dev/urandom,或者当前时间+主机MAC+伪随机数生成器
附加:typedef unsigned char uuid_t[16];
函数:void uuid_unparse(uuid_t buuid,char *cuuid);
功能: 把uuid从二进制格式转换成字符串格式
参数:
uuid_t buuid:二进制型uuid,由uuid_generate生成
char *cuuid:结果字符串,出参,字符串型uuid
8. Linux平台数据类型
Linux平台特定数据类型定义文件:/usr/include/stdint.h
部分截图如下:
7.线程
头文件:#include
函数原型:
int pthread_create(
pthread_t *thread,
const pthread_attr_t *attr,
void* (*func) (void *arg),
void *arg
);
功能:创建线程
返回值:成功返回0, 失败返回错误码
示例:
6. 计时器
头文件:#include
函数原型:int gettimeofday(struct timeval *tv, struct timezone *tz);
功能:返回自Epoch经过的时间,精确到微秒
返回值:成功返回0,失败-1,置错误码
示例:
5. 互斥锁
函数:int pthread_mutexattr_init(pthread_mutexattr_t *attr);
功能:初始化属性对象
参数:pthread_mutexattr_t类型的属性对象
返回值:成功返回0,否则错误码
函数:int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
功能:设置mutex类型
参数:
pthread_mutexattr_t *attr:待设置的属性对象
int type:mutex类型
返回值:成功返回0,否则错误码
类型:
PTHREAD_MUTEX_NORMAL:重复加锁,将导致死锁;释放其它线程持有的锁,将导致未定义的行为;释放未加锁的锁,将导致未定义的行为。
PTHREAD_MUTEX_ERRORCHECK:重复加锁,将返回错误;释放其它线程持有的锁,将返回错误;释放未加锁的锁,将返回错误。
PTHREAD_MUTEX_RECURSIVE:重复加锁,没有问题,但需释放相同次数;释放别人的锁,将返回错误;释放未加锁的锁,将返回错误。
PTHREAD_MUTEX_DEFAULT:重复加锁,未定义的行为;释放别人的锁,未定义的行为;释放未加锁的锁,未定义的行为。
函数:int pthread_mutex_init(pthread_mutex_t *mtx, const pthread_mutexattr_t *attr);
功能:初始化mutex对象
参数:
pthread_mutex_t *mtx:待初始化锁对象
const pthread_mutexattr_t *attr:属性设置
返回值:成功返回0,否则错误码
说明:重复初始化,将导致未定义的行为
函数:int pthread_mutex_destroy(pthread_mutex_t *mtx);
功能:销毁锁对象
参数:待销毁的锁
返回值:成功返回0,否则错误码
说明:销毁后,二次引用锁对象,未定义的行为。销毁未加锁的锁,没有问题;销毁已加锁的锁,未定义的行为。
函数:int pthread_mutex_lock(pthread_mutex_t *mtx);
功能:上锁
参数:目标锁
返回值:成功返回0,否则错误码
函数:int pthread_mutex_unlock(pthread_mutex_t *mtx);
功能:释放锁
参数:目标锁
返回值:成功返回0,否则错误码
4. 获取socket对应的地址
头文件:#include
函数原型:int getsockname(int s, sockaddr *addr, socklen_t *addrlen);
功能:返回socket s绑定的本地地址信息
返回值:成功返回0,失败-1,置错误码。
示例:
3. 头文件
#include C标准库头文件,对应标准输入输出;
#include C标准库头文件,对应字符串操作。
C++不赞成混用C函数库,故对C标准库进行封装,对应如下:
#include C++对C库的封装,printf的头文件
#include C++对C库的封装,strerror的头文件
另有
socket和sockaddr对应的头文件为
#include
#include
#include
#include
错误码errno头文件
#include
2. 使用VS2010编辑linux代码
编写完成后需转换格式,防止文件放到linux下出现乱码和编译问题。
VS2010——文件——高级保存选项:
编码:Unicode(UTF-8 无签名)
行尾:Unix(LF)
1. 静态编译和动态编译
链接库类型决定编译类型
使用.a静态库:实现静态编译,库代码直接加入到生成的可执行文件中,故可执行文件较大,但脱离对库文件的依赖
使用.so动态库:实现动态编译,生成的可执行文件较小,运行时进行动态链接,可执行文件和库文件必须同时存在
静态编译方法:直接加库名,无参数
g++ -o mainmain.cpp /path/libname.a
假设静态库为/path/libevent.a,则编译命令如下:g++-o mainmain.cpp/path/libevent.a
动态编译方法:-L库路径 -l库简名
g++ -o mainmain.cpp -Lpath -lname
假设动态库为/path/libevent.so,则编译命令如下:g++-o mainmain.cpp -L/path/ -levent
动态编译提示:
a. 编译完成后,需将动态库文件,放入系统默认库目录,否则出现编译时链接成功、运行时链接失败的结果。
b. -L选项仅指定了编译时链接路径,库代码未嵌入到可执行文件。运行时链接,由系统自动搜索默认库文件路径完成。
c. 默认搜索路径—/usr/lib,添加搜索路径—echo "/usr/local/lib" >> /etc/ld.so.conf,更新—ldconfig。
附加:
头文件路径
参数-I/path/指定头文件路径
#include :先搜索-I指定的目录,之后是系统默认头文件目录;
#include "file":先搜索当前目录,然后是-I目录,最后是系统默认目录。