存档

‘C/C++’ 分类的存档

最近的一点感慨

2016年11月22日 没有评论 879次阅读    

正直,比什么都重要。

最容易出bug的,不是代码,而是人。人与人打交道,有利可图的各种灰色case。

正义,最终会战胜邪恶。

Share
分类: C/C++ 标签:

修改libtask支持epoll处理大量并发连接

2014年10月10日 没有评论 3236次阅读    

原生的libtask库不支持epoll, 这样无法处理大量并发协程的情况,所以小改了下,让它支持epoll,允许大量并发协程运行。代码在这里libtask_epoll

修改方法比较简单,就是把epoll_create, epoll_ctl, epoll_wait 几个函数的使用替换掉原来poll相关的函数,diff在这里阅读全文...

Share
分类: C/C++, TCP/IP, UNIX/LINUX, 协程 标签:

memcached里面一段神奇,危险,暂且无bug的code: add_iov

2014年10月7日 没有评论 2592次阅读    

翻memcached代码,看到一个函数:add_iov , 在里面着实纳闷了许久,多次认为这个代码会有问题,于是打日志,gdb上去调试,最后不得不承认: 这代码能work!(不过很危险)

阅读全文...

Share

memcached源码学习-线程框架

2014年7月8日 没有评论 3745次阅读    

看了看memcached, memcached 主要的线程框架是master-slave的主线程-工作线程模式,单进程,多线程,之间通过管道和链表通信,基本就是这样。

下面具体看下代码。 阅读全文...

Share

libtask协程库实现源码学习-异步I/O

2014年6月30日 没有评论 3733次阅读    

上篇文章写了libtask协程库实现的基本原理,最后说道协程编程一个很大的关键点是,程序员需要知道什么时候应该进行协程切换,什么地方需要异步I/O,什么地方的代码是顺序运行的等。

这里回顾一下具体哪些地方需要做协程切换,异步I/O: 所有可能会造成阻塞的操作,都必须进行异步IO处理,及时切换协程,绝对不能在协程里面做阻塞操作,因为阻塞了大家都阻塞了,就黄了。

顺藤摸瓜,上次的http压力测试小程序里面,协程执行函数fetchtask就是协程运行的主要函数,看下其实现: 阅读全文...

Share

libtask协程库实现源码学习

2014年6月29日 6 条评论 12681次阅读    

协程的概念不多说了,轻量级线程,其最大的优势就是协程之间的切换代价非常低,理论上是单线程运行,只是在应用层进行了上下文手动切换。

其最重要的实现函数是makecontext, getcontext, swapcontext 这一组函数,具体的协程上下文切换由他们完成。具体就不多说了,这些函数在glibc里面是已汇编的形式提供的,实际上做的工作就是讲各个寄存器,堆栈指针,指令指针等全部保存起来,或者进行切换,从而达到协程切换的目的。我们知道程序在CPU上运行的时候,注意依赖2个重要的东西: 阅读全文...

Share

Redis Scan迭代器遍历操作原理(二)–dictScan反向二进制迭代器

2014年4月19日 4 条评论 8375次阅读    

续上一篇文章 Redis Scan迭代器遍历操作原理(一)--基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分)。

关于这个算法的源头,来自于githup这里:Add SCAN command #579,长篇的讨论,确实难懂····建议看看这帖子,antirez 跟pietern 关于这个奇怪算法的讨论···

这个算法的作者是:Pieter Noordhuis,作者称其为:reverse binary iteration ,不知道我一对一翻译为“反向二进制迭代器”可不可以,不过any way ··作者自己也没有明确的证明其真假: 阅读全文...

Share
分类: C/C++, Redis 标签:

Redis Scan迭代器遍历操作原理(一)–基础

2014年4月12日 4 条评论 12072次阅读    

Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了···

命令的官方介绍在这里, 中文版由huangz同学细心翻译了,作者Antirez的介绍在这里:Finally Redis collections are iterable (我又邪恶的想到了之前他那次机器down机的事故了···)。

具体的使用参考上面的链接即可,这里大概介绍一下Scan操作的实现原理。 阅读全文...

Share
分类: C/C++, Redis 标签: ,

一次由于sbrk()无法压缩导致内存RSS虚高造成“内存泄露”的假象

2014年4月4日 没有评论 2170次阅读    

最近写的一个C网络服务器程序在高压力后top进程看内存的RSS总是等于最高值, 以为是内存泄露,到处查看代码没问题,用valgrind跟了一下也还是没有发现问题。

于是将malloc改为自己的函数记录了一下程序的malloc, free操作,从而算出还有多少大小内存没有释放,最后结果是一切正常,基本都释放了,但奇怪的是RSS却没有降下来。 阅读全文...

Share
分类: C/C++ 标签: , ,

librtmp实时消息传输协议(RTMP)库代码浅析

2013年11月30日 1 条评论 27855次阅读    

没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据。

代码在这里:git clone git://git.ffmpeg.org/rtmpdump

先看一段通过librtmp.so库下载RTMP源发布的数据的例子,从rtmpdump中抽取出来。使用的大体流程如下:

  1. RTMP_Init主要就初始化了一下RTMP*rtmp变量的成员。
  2. RTMP_SetupURL 函数将rtmp源地址的端口,app,等url参数进行解析,设置到rtmp变量中。比如这样的地址: rtmp://host[:port]/path swfUrl=url tcUrl=url 。
  3. RTMP_SetBufferMS 函数设置一下缓冲大小;
  4. RTMP_Connect函数完成了连接的建立,一级RTMP协议层的应用握手,待会介绍。
  5. RTMP_ConnectStream总的来说,完成了一个流的创建,以及打开,触发服务端发送数据过来,返回后,服务端应该就开始发送数据了。
  6. Download 其实是RTMP_Read函数的封装,后者读取服务端的数据返回。

阅读全文...

Share
分类: C/C++, RTMP, TCP/IP 标签: ,

使用Coan来净化众多的预编译指令,简化C/C++代码

2013年11月4日 没有评论 24183次阅读    

看开源代码的同学经常有个影响阅读的问题是许多的预编译指令,导致阅读很不顺畅。比如nginx代码中包含关于defined(WIN32) 的代码分支等。
找了很久没有找到能够净化,自动移除不需要的代码的工具,后来朋友介绍了Coan这个工具,(翻墙才能访问)。使用后妈妈再也不担心我的代码了!强烈推荐!不过好像隐约感觉,GCC预编译器应该就有这个功能,可能是某个参数指定。
比如我的需求是为了净化如下代码: 阅读全文...

Share
分类: C/C++, 软件工程 标签:

使用贝叶斯统计进行垃圾邮件过滤

2013年10月17日 3 条评论 2761次阅读    

占个坑,贝叶斯进行垃圾邮件过滤方法简单,效果也挺明显的。基本能满足一般需求。具体算法不多说,google即可。

贝叶斯在线上使用的准确性其实严重依靠人工的调整的,需要进行巧妙的调整才能极大的提高降低误判率。

下面贴个代码,从其他地方考过来改吧改吧的。 阅读全文...

Share
分类: C/C++, 算法 标签: ,

spawn-fcgi 代码介绍

2013年10月3日 没有评论 6749次阅读    

spawn-fcgi是一个小程序,作用是管理fast-cgi进程,功能和php-fpm类似,简单小巧,原先是属于lighttpd的一部分,后来由于使用比较广泛,所以就迁移出来作为独立项目了,本文介绍的是这个版本“spawn-fcgi-1.6.3”。不过从发布新版本到目前已经4年了,代码一直没有变动,需求少,基本满足了。另外php有php-fpm后,码农们再也不担心跑不起FCGI了。

很久之前看的spawn-fcgi的代码,当时因为需要改一下里面的环境变量。今天翻代码看到了就顺手记录一下,就当沉淀.备忘吧。 阅读全文...

Share
分类: C/C++, Nginx, PHP 标签: ,

Redis主体事件循环流程介绍

2013年8月25日 没有评论 4605次阅读    

回顾一下之前看的redis代码,脑子内存比较小,一会就忘了,所以备忘一下。
redis主体流程比较简单,init,listen, accept, read, write,基本就是这几步。下面简单介绍一下,当做备忘。 阅读全文...

Share
分类: C/C++, Redis, TCP/IP 标签: ,

mysql数据热备份工具xtrabackup使用介绍

2013年8月10日 没有评论 3202次阅读    

最近需要用XtraBackup进行mysql数据备份,Gaojie同学推荐的工具,效果还不错,推荐。

详细的介绍请移步上面的链接去官网查看,官网介绍的很清楚了,这里只是就一些容易总结和容易犯的错误等。如果确定数据库的表全部是myisam的表,那就可以简单用“mysql数据热备份脚本-MYISAM表”里的方法做文件备份了,简单的东西总是"更简单可依赖"。

XtraBackup包含2个主要的部分:C程序xtrabackup, perl包装代码innobackupex  , 实际上后者调用了前者,提供一些包装的功能。因为xtrabackup只支持Innodb表,所以innobackupex  额外提供备份myisam表的能力。下面会说一下其原理
阅读全文...

Share

Nginx upstream原理分析【1】-无缓冲模式发送数据

2013年5月18日 没有评论 4157次阅读    

前阵子学习了一下nginx 关于接收upstream的数据,然后发送给客户端的过程,总结一下。

下面的许多注释等是在upstream后面是FCGI协议而介绍的,比如nginx连接后端php-fpm的情况下。nginx接收到客户端的header数据后会调用各个处理过程,也就是ngx_http_core_content_phase,该过程会不断调用各个阶段(phrase)的回调函数,依次进行配置解析,重定向,访问控制,内容处理等过程。

在内容处理的回调ngx_http_core_content_phase()中,会调用ngx_http_fastcgi_handler,请求由后者接管。

nginx中关于upstream经常围绕在ngx_http_upstream_s上面,这上面包括各种缓冲区数据,回调等,所以先看一下ngx_http_upstream_s结构的内容,具体含义注释下面了。

阅读全文...

Share
分类: C/C++, Nginx 标签: , ,

nginx 配置文件解析原理

2013年4月26日 没有评论 1627次阅读    

最近看了nginx配置文件解析的相关代码,用Graphviz花了个草图,够草的图····

先做回标题党,最近事情比较多

阅读全文...

Share
分类: C/C++, Nginx 标签:

由换座便器冲水管想到的软件开发中的接口设计

2012年10月3日 没有评论 1281次阅读    

前段时间家里的座便器按下去后好一阵子才能弹起来,其影响为:
1. 声音很大吵人;
2. 随机出现弹不起来,得再去按一下才行;
3. 浪费水资源;
因此必须换了,之前一直没有时间,正好国庆在家没有出去玩。目测是因为里面的冲谁管弹簧坏了,所以到外面的水暖店里面买了个冲谁管,老板说都是通用的(赞),样子如下图: 阅读全文...

Share

inet_ntoa 是采用静态内存分配的 线程安全 函数

2012年8月12日 2 条评论 3591次阅读    

好吧,其实这是个很简单的问题

1.原因

好久没碰过C代码了,刚看到inet_ntoa(),突然想到这个应该是静态分配的内存,不用释放。但不知道是不是线程安全的,就是说一个线程一份buffer。 阅读全文...

Share
分类: C/C++, UNIX/LINUX 标签:

关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因

2012年7月1日 没有评论 1245次阅读    

关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因

我们知道,类的构造函数里面编译器插入了很多代码,比如异常安全,虚函数表指针的设置,基类构造,等等。

而且,关键是这些代码时在任何用户的代码(非初始化)的地方之前插入的,问题就来了···

如果在基类构造函数里面调用基类的虚函数,那么,实际调用的却不像我们当初认为的多态效果,为什么呢?

下面看看编译怎么实现的就知道了····
阅读全文...

Share
分类: VC++ 标签: , ,