随笔分类 - C
摘要:There are times when you want to wrap a library function in order to provide some additional functionality. A common example of this is wrapping the standard library’s malloc() and free() so that you can easily track memory allocations in your program. While there are several techniques for wrapping library functions, one well-known method is using dlsym() with RTLD_NEXT to locate the wrapped function’s address so that you can correctly forward calls to it.
阅读全文
摘要:linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。也就是说,信号会随机发个该进程的一个线程。 2 signal函数BSD/Linux的实现并不在信号
阅读全文
摘要:介绍nginx架构
阅读全文
摘要:本文给了一个CGo中使用一维数组和二维数组的示例。
阅读全文
摘要:Valgrind可以有效地监测处大多数内存问题,你肯定忍不住会想,既然c/c++的内存问题这么常见,为什么不在编译器中加入内存问题检测的功能呢? 很可惜,GCC中还目前还不支持内存检测,可喜的是,clang支持。这里我们看看如何用clang发现内存问题
阅读全文
摘要:在用C/C++编程的时候,经常会出现下面三种内存问题:
内存泄漏
悬挂指针
多次释放同一块内存
本系列文章简要介绍排查这三个问题的工具和方法,先看看Valgrind
阅读全文
摘要:近期,我们的DNS服务器收到了一些异常的域名请求,从访问日志看到很多域名都被返回了FORMAT ERROR的错误码,但是访问日志中的域名看起来很正常啊,为什么会返回FORMAT ERROR的错误码呢? 经过一系列排查,找到了直接原因。 问题在于我们收到的一些DNS消息包的请求域名中含有值大于127...
阅读全文
摘要:本文对C的正则库regex和pcre在做域名验证的场景下做评测。验证DNS域名的正则表达式为:"^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]{2,}\\.)$"对于正常DNS请求日志中的6177578条日志做正则验证处理。1,pcre评测所用的pcr...
阅读全文
摘要:我们的一个服务器软件在线上环境运行时出现了内存缓慢增长的问题。用valgrind测试 MySQL的C客户端mysqlclient发现,它在正常的使用中会被valgrind报出存在内存泄漏。1正常使用场景下面的代码是使用mysqlclient读取数据的最常用的代码#include #include i...
阅读全文
摘要:strtok的典型用法是: p = strtok(s4, split); while(p != NULL){ printf("%s\n", p); p = strtok(NULL, split); } 需要注意的是:如果s4是字符串常量,运行这一段代码会报出段错误。因为strtok为了处理方便,会更改字符串s4中的一些字符(将分隔符split更改为'\0'),而字符串常量是不能更改的,所以会报段错误。 第二个需要注意的点是:strtok处理的过程中会更改字符串s4中的一些字符(将分隔符split更改为'\0'),可恶的是,它处理完之后还不会给
阅读全文
摘要:详细分析了glibc中strlen的实现过程。
阅读全文
摘要:本文简单介绍了C语言中的一些常见的编译预处理指令。
阅读全文
摘要:解析C语言中sizeof关键字的详细用法
阅读全文
摘要:google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大。所以,我这篇博文博采众家之长,把互联网上的资料整合归类,并亲手编写程序验证之。 C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。 下面,详细分析一下static关键字在编写程序时有的三大类用法: 一,static全局.
阅读全文
摘要:编译程序有八个步骤。这些步骤包括:1. 从源代码文件中读取字符,如果有必要的话,将字符转换成源代码字符集的字符。如果源代码中的行尾字符和换行字符不一样,就进行替换。类似地,任何三字符组符号会被替换成赌赢的单一字符。2.不管什么时候,只要反斜线符号后面紧跟着换行字符,预处理器就会将两者(反斜线和换行字符)都删除。因为预处理器的指令结束的地方就是行的结束字符,所以这个处理步骤会将反斜线放在一行的结尾处,以让预处理指令在下一行继续。3. 此源代码文件被分解成预处理器的记号和空格符。每个注释都被视为一个空格。4. 预处理指令被执行,宏被展开。5. “字符常量”和“字符串字面值”内的字符和转义符,会被转
阅读全文