编程

A collection of 16 posts

对 Python 异常处理的笔记

简述 Pro Python 这本书里对 Python 异常处理的讨论。 包括异常的捕获、处理,异常链,以及异常处理相关的 else, finally, with 关键字等内容。 最简单的捕获异常的方式 def count_lines(filename): try: return len(open(filename, 'r').readlines()) except: return 0 很少有人在生产环境写这样的代码,它会捕获所有的异常,可能包括你希望处理的,也包括你其实并不想处理的异常,

好好写 Shell 脚本

shell 种类众多,并且语法各异,如果自己又不熟悉任何一种 shell 的话,就会经常感觉语法怪异,而且似乎不够严谨,甚至有时候要边搜边写,这就使得一些脚本成为了一些勉强可用的语句的拼凑,几乎不可维护。即便是一些所谓的“技术大牛”,各种高大上的词都能吹得天花乱坠的,也写不了像样的脚本,这是个蛮尴尬的事情,固然是术业有专攻,但是写个 Linux Shell 脚本,应该算是个基础(其实有可能他们连链表怎么实现都不知道)。这里主要是说最为通用的 bash,以下是几条 bash “代码规范”。 1. 及早退出 脚本的开头,#! 语句之后,加上这几行

利用 git 分支的开发流程

这篇 2010 年的文章 A successful Git branching model 讲了一个比较合适的使用 git 进行版本控制的流程。主要是有两个主要分支:master 和 develop 分支,和其他辅助分支:feature 分支、release 分支、hotfix 分支。 主要分支 每个 repo 包含两个永远都不删除的分支 master 生产环境的版本 develop 待发布的最新开发代码分支 develop 分支不会进行很大的功能、

free 命令 buffers 和 cached

大多数 Linux 用户应该都知道通过 free 命令或者 cat /proc/meminfo 查看内存使用情况。 下面是 free 命令结果的一个示例: total used free shared buffers cached Mem: 2049916 1139976 909940 680 105628 381768 -/+ buffers/cache: 652580 1397336 Swap: 0 0

Linux 信号处理

使用 sigaction 绑定信号 比较早的时候,使用 signal,现在正在逐渐被抛弃,sigaction 是更好的选择。主要是因为如下原因: signal 在不同系统的行为可能不一致,如果自定义了信号处理函数,进入信号处理函数时,对当前信号的操作可能变为默认,也可能屏蔽该信号。只有设置信号处理方式是 SIG_IGN(忽略)、SIG_DFL(默认)是可移植的。 signal 不能设置在信号处理函数执行过程中屏蔽其他信号 在多线程的进程中 signal 的效果不确定 signal 接口最主要的问题还是不可移植,其实现在 Linux

用 epoll 的 echo 程序

完整代码放在最前面,只是一个简单的 echo 程序,没有业务逻辑,收到数据之后立即发送回去。然而,还是有些细节值得记录一下,关于 TCP Server 通常需要设置的 TCP 套接字属性,屏蔽 SIGPIPE 信号,以及最重要的:如何使用 epoll,ET 模式和 LT 模式是怎样的。 #include <stdio.h> #include <unistd.h&