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  

FastDFS中的tcprecvdata_ex与tcprecvdata_nb_ex

FastDFS与socket相关的函数一般放在common/sockopt.c文件里,其中有两个函数,非别为tcprecvdata_ex和tcprecvdata_nb_ex。从名字上看,很明显后者是想表达nonblock的意思,那么看代码证实一下。它们的代码分别如下: