编程笔记

上周本来打算用 RabbitMq 的方式来实现日志信息记录, 但在装完 Erlang 的时候就后悔了, 平白的引入 Erlang 和 RabbitMq 到系统中给原来已经繁杂而且要到处部署的系统增加了复杂度, 万一这种方式出错了要排查起来也不是那么容易. 随即采用了简单的 expire 方式, 但在实现过程中又发现了有些日志记录在了 List 中, 并且不是一天一个键, 所以只好将其限制长度最大为 1K . 随着工作的深入, 发现导致 redis 巨大的原因在于某些日志根本没有被清理, 这是由于随着系统的发展改变了原来记录日志的策略, 但是由于两边的不统一, 没有清除原来的日志键, 导致不停的堆积.

昨晚重新拿起被自己放下有近 20 天的 skynet 注释工作, 粗略的翻了一遍发现 skynet-src 下边的文件基本上都注释完毕了, 就差 socket-server 和 malloc-hook 两个模块了. 在注释过程中了解到 ssize_t 这个曾经没有接触过的类型. 但这个类型不是 ANSI C 中的标准数据类型, 也就找了好一会儿定义在何处. GNU C 的定义比较好找, 在 sys/types.h 中, 并且此头文件被 stddef.h 包含. 在 FreeBSD 中也是在 sys/types.h 中, 但是却不是直接被 stddef.h 包含, stddef.h 直接包含的 sys/_types.h, 后者又包含了 machine/_types.h , 但是愣是没找到这个 machine/_types.h 文件在何处. 在此顺便说一下, Linux 和 FreeBSD 以及 XNU 等平台上的头文件的分布位置各不相同, 对于习惯于 JavaDoc 的我来说很是不方便, 没想到 C 里边的跨平台牵扯到这么多知识. 看来还有一段很长的路要走了. 在 FreeBSD 中, sys 头文件被放在 sys/sys/ 目录下边, 而在 Linux 则是在 include/sys/ 下边.

若是某位朋友能够推荐一两本 Linux 和 FreeBSD 的著作, 真是不甚感激!

在此也把平时研习时候找到的资料贴出来.

手册中的 2、3 部分是系统调用和函数库调用.

顺便也推荐下编程的智慧一文. 文中给出了一些如何写出更易维护的代码的原则, 比如模块化编程、有意义的函数和变量名、不重用局部变量以及消除循环中的 break 和 continue 等. 总的来说这些原则的跟编程风格那本书很像, 就是要保持代码足够简单易懂, 且明显没有错误. 文中提到提升编程能力的唯一方法就是反反复复地修改和推敲代码, 甚得我心.

回到 ssize_t , 在 glibc 文档中说此类型是用来表示读写操作可读写的块的大小, 和 size_t 类似, 但是是有符号类型. 此类型一般用作返回值, 当返回负数时通常意味着出错. 以 _t 结尾的这些数据类型被称为原始系统数据类型, 它们通常在 中定义, 通常是以 C typedef 说明加以定义. 它们的目的是阻止程序使用专门的数据类型, 让不同的实现可以选择不同的数据类型.

Leave a Reply

Your email address will not be published. Required fields are marked *