2013年12月

FastDFS日志系统分析

0.为什么要有日志

在软件开发从业者眼中,日志的重要性应该是不言而喻的。浅显的说,日志的作用体现在如下几个场景:

  1. 其实我们大部分人写的第一个程序Hello World就是一条日志,只不过该日志直接输出到了屏幕上。它告诉我们,程序按照我们的意愿执行了。
  2. 慢慢我们的代码行数开始变多,终于可以写个几十上百行的程序了。代码中也开始有逻辑有算法了,但在解决了一堆编译错误后,从会遇到程序执行的结果不是我们想要的情况。经过一番推测,我们觉得是变量i的值在这个时刻不对,但这只是猜测而已,为了印证,不如把i的值在程序运行到此刻打印出来看看?
  3. 我们学会了GDB或其他调试工具,渐渐的觉得用打印的手段来调试有些太弱了。开始不太好意思跟别人在别人面前往代码中插入printf语句了。
  4. 终于我们的代码行数越来越多,逻辑越来越复杂。一个程序分的执行分成了很多个阶段,各种回调函数满天飞,我们的程序也不再是从上到下一条线执行了,不仅有多进程,还有多线程。出了问题,祭出GDB。每次都要GDB进去,设断点,设置跟踪子进程、挂载线程...更有可能,问题并不能复现。身心疲惫。
  5. 同时我们也在接触一些稍微复杂些的开源软件。出了问题发邮件去请教别人,往往得到的第一句回答是:“把XXX的log发过来看下。”

- 阅读剩余部分 -

O_EXCL的作用

1.原始语义

与O_CREATE标志组合起来调用open,确保指定的文件由open的调用者创建,否则返回错误。即,如果进程A用O_CREATE和O_EXCL标志来调用open,期望创建一个指定的文件file1,如果file1不存在,则open成功返回且创建file1,如果file1已经存在了(即不是由进程A创建的),那么open返回错误。

2.使用场景

O_CREATE|O_EXCL多用于确保一个一个程序只能执行单个进程,不能执行多个进程。原理如下,假设进程A是某程序的一个实例,如果它用O_CREATE|O_EXCL标志能够成功创建指定的文件,说明它是该程序的唯一实例,可以继续执行;如果返回错误,说明该文件已经存在,进而说明系统中已经运行着一个该程序的其它实例,检测到错误的返回值后,该实例就可以退出了。

之所以能这么用的唯一理由是该操作是原子的

之所以这么说,理由如下。假设同样语义的非原子的操作流程如下:

if( access(file, R_OK) == -1 )   /* 首先检查文件是否存在 */
    open(file, O_RDWR | O_CREAT,0666);  /* 如果不存在,那我创建一个这样的文件 */
...  /* 继续执行任务 */

- 阅读剩余部分 -

从emlog换到typecho

typecho终于迎来大的更新了,从2012年5月8号官网放出一篇名为《Its about time》的日志后,让各路淫民翘首以待,谁都没想到一翘就翘了一年多。

从两年前买了域名+空间后,试过了各种博客程序,wordpress,typecho,emlog,textpattern等等,但最喜欢的还是emlog和typecho,后来一直用的是emlog。说实在话,对emlog很满意的,emlog的社区也做的不错,但这次typecho的更新太吸引人了,还是转了过来。更换程序是很彻底的,我丝毫没有考虑如何在url上做文章,对这个网站和搜索引擎而言,意味着N多死链,但幸好对我自己而言,不意味任何东西。

这个博客一直放在一个虚拟空间里,除了用ftp上传网站代码外,几乎没有任何权限。虽然早已有一个vps,但仍然没有把它迁过来,让它安静的躺在这里吧。

断断续续的写一些无病呻吟的文章已经两年了,而且在可预测的未来,这些无病呻吟的文章还会继续写下去。

有一部电影里有这么一句台词,艺术是什么,艺术是人类在这个星球上存活过的痕迹。对我而言,这些乱七八糟的文字就是我生活的痕迹。只需要看到文章发表日期就行了,文章内容怎么样,其实并不重要。

希望博客改头换面后,能多写点东西,质量上能稍微有些提高。

誓要去,入刀山

周末,成都的一个朋友陪他的一个哥们来广州玩,原因是他这个哥们跟女朋友闹别扭了心里难受,他陪他出来转转。中午把他们接到后,吃了顿饭,到我的住处坐坐,然后就去订了几张电影票,看了《扫毒》。

《扫毒》是个怀旧的电影,但如何个怀旧法,每个人的感受不同。诚然,跟很多人一样,我也认为影片本身香港八九十年代兄弟情的主题确实是怀旧的一大因素,但对我而言,最能体现怀旧情绪的,是主题曲《誓要去,入刀山》。

兄弟三人第一次哼起这首歌时,我就意识到,这歌词我肯定在哪里看过。终于,电影放完后,我想起来,这歌词取自《陆小凤传奇》之《凤舞九天》,初中时,把一套一共四册的《陆小凤传奇》看了七八遍(后来才知道,这套书缺了最后一部,《剑神一笑》),而这一段更是我非常喜欢,翻来覆去来回看的:

誓要去,入刀山;浩气壮,过干关。豪情无限,男儿傲气,地狱也独来独往返!
存心一闯虎豹灾,今朝去几时还?
奈何难尽欢干日醉,此刻相对恨晚。
愿与你,尽一杯」聚与散,记心间」毋忘情义,长存浩气,口后再相知未晚。“
歌已尽,酒已空。陆小凤放下碗筷,转身离去。
“慢着!西门吹雪随着大喝声站起,走向又转过身来的陆小凤。
西门吹雪没有说话,他只是伸出他的一双手。
他的手紧握着陆小凤的双腕,陆小凤的手也紧握着西门吹雪的腕。
西门吹雪激动的轻轻吟诵:“毋忘情义,长存浩气,日后再相知末晚。”
西门吹雪眼中已温热。陆小凤放开西门吹雪的手腕,大步走了出去。
只听陆小凤的豪放的歌声,犹自在黑夜中袅绕:“毋忘情义,长存浩气,口后再相知末晚。”

这么多年过去了,竟然还能记起,记起一首歌,就是记起一段青春。有些东西,随着时间的流逝,慢慢被藏到内心深处,但它们并没有消失,只是放在那里,等着某一天忽然被想起。

AF_INET与PF_INET的区别

在一些开源项目的socket相关代码中,会同时看到AF_IENT和PF_INET,这两者有什么区别呢?

其实这两个东西就是当年设计上的误差而已。AF=Adress Family;PF=Protocal Family,原来的设计是设想一个AF会支持多个PF,但是就没有然后了。现在为止,这两个东西就是一样的,Linux源代码为证:

/* Protocol families, same as address families. */
#define PF_UNSPEC   AF_UNSPEC
#define PF_UNIX  AF_UNIX
#define PF_LOCAL    AF_LOCAL
#define PF_INET  AF_INET

参考:
http://stackoverflow.com/questions/6729366/what-is-the-difference-between-af-inet-and-pf-inet-in-socket-programming