面对'错误'的抉择
大凡写程序者,都会遇到错误; 大凡写程序者也都知道两种错误处理的机制:传统的’错误码返回机制’和’面向对象语言引入的异常处理机制’。 ...
大凡写程序者,都会遇到错误; 大凡写程序者也都知道两种错误处理的机制:传统的’错误码返回机制’和’面向对象语言引入的异常处理机制’。 ...
今天凌晨配合云南移动进行局数据全量升级,本来以为是件很轻松的活计,甚至不需要我动手的事情,结果却又是一次惨痛的教训啊。 这个活计其实真的很简单,就是将数据库中的旧数据全部删除,然后导入新的数据,由于数据量较大需要重启一次我们的系统。问题就在重启系统上。摆在我面前的就是"重启失败",系统dump一个core文件。通过pstack和gdb查看如下: core ‘core’ of 7971: xxxxx -s fe647b38 t_splay (3a71b0, 229, 228, 3a7000, 3ca548, 8000000) + 14 fe6475ec realfree (3ca320, 741f4, 320974, fe6bc000, 0, 3209a5) + c8 fe647e5c cleanfree (0, 7, fe6c29bc, 1a8, 3a7008, 0) + 54 fe646f88 _malloc_unlocked (ea60, 0, ff13de50, fe6bc000, ff184ae6, 0) + f4 fe646e78 malloc (ea60, 3e8, 0, 2, f8e9dacb, 1) + 20 000fa330 我们一业务函数,暂叫A_func吧 (18, 186a0, ffbfe4b0, 30330000, 37, ff00) + 1fc ...
自从上次’编译Ethereal On Windows‘之后,好久没有接触Ethereal了,前期策划的基于Ethereal开发的一个工具的任务就落到了这批来的一个新员工的头上了。第一阶段他在Windows上开发了一个基于Ethereal的插件用于分析CMPP协议之用;第二个阶段我们需要移植到Unix上,我们使用的是Solaris。 ...
近期公司实行新的绩效考核机制,我的考核目标中就有一项叫做:“成功使用新技术、框架、思路等至少3个”,呵呵,先不论绩效考核机制是否合理,既然已经这样了那就需要去适应。一直在做Network Application,早就知道ACE在业界中的名气,这回有理由找个时间好好挖掘一下ACE的思路,也为我的绩效目标增色啊^_^。 ...
程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。遇到任意一条编译器警告都坚决不放过。有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splint。这个建议也很不错。不过lint工具使用起来较繁琐,有时候还需要记住一些特定符号并插入到你自己的代码中才行,门槛较高,这也让很多人止步于此。那么我们就从此放弃么?不,如今的编译器做得都很好,它可以帮助我们的找到绝大多数可能出现问题的代码,前提是你要学会控制编译器去找到这些问题代码,而熟悉编译器的警告选项恰恰是体现控制力的好方法。当你可以自如控制编译器警告输出的时候,你就算是’入道’了,同时你对语言的理解也更进一步了。 ...
在线程同步方面,Posix标准定义了3种同步模型,分别为互斥量、条件变量和读写锁。APR也“浅”封装了这3种模型,只是在“读写锁”一块儿还没有全部完成。 线程同步的源代码的位置在$(APR_HOME)/locks目录下,本篇blog着重分析unix子目录下的thread_mutex.c、thread_rwlock.c和thread_cond.c文件的内容,其相应头文件为(APR_HOME)/include/apr_thread_mutex.h、apr_thread_rwlock.h和apr_thread_cond.h。 ...
“这个世界如果没有了网络就好比没有了石油、没有了电一样,是多么的可怕呀。”相信世界上已经有很多很多的人能够同意这种观点了,通过这个观点也可以看出网络在现代人们心中的地位。而运行在网络节点上的网络应用程序则是在幕后默默地为人们提供着服务。Apache Server就是其中一个典型的代表。而APR网络I/O库则像磐石一样支撑着Apache Server的运行。 ...
如果它不存在,但是你能看见它 — 它是虚拟的(IBM宣传虚拟内存之用语)。虚拟内存技术是计算机发展史上的一项重要的技术,它帮助应用程序摆脱了“体积”的限制。 ...
不得不承认上次关于栈桢和栈操作写得有些笼统,这里做一次“补充”,美名其曰:“复习”。 下面的这个例子几乎就能覆盖所有的栈操作相关的内容了。 void dummy() { int i = 12; int j = 13; char c = ‘a’; } ...
Unix提供了等待信号的系统调用,sigsuspend就是其中一个,在CU(www.chinaunix.net)上曾经讨论过一个关于该系统调用的问题,这里也做一下解疑。 CU网友讨论的问题的核心就是到底sigsuspend先返回还是signal handler先返回。这个问题Stevens在《Unix环境高级编程》一书中是如是回答的“If a signal is caught and if the signal handler returns, then sigsuspend returns and the signal mask of the process is set to its value before the call to sigsuspend.”,由于sigsuspend是原子操作,所以这句给人的感觉就是先调用signal handler先返回,然后sigsuspend再返回。但其第一个例子这么讲又说不通,看下面的代码: CU上讨论该问题起于中的该例子: int main(void) { sigset_t newmask, oldmask, zeromask; ...