逐步实现TCP服务端Step06-1:Libevent

Libevent是基于C语言开发的高性能开源通信库。Libevent是Reactor模式的一个实例。Reactor是一种事件处理模型,其基本形式: 其中,Reactor为核心部分,它是使用者启用Reactor机制的入口。EventDemultiplexer是事件分离器,Reactor使用它来监测事件的发生。Processor是事件处理器,它用于处理,或者说响应某个特定的事件。ConcreteProcessor的存在是为了方便模式使用者定制事件处理逻辑。Reactor、EventDemultiplexer和Processor三者基于句柄(Handle)建立关联,比如socket文件描述符 ...


封装MySQL的C语言API

为方便使用,对MySQL提供的C语言API进行包装。考虑到在实际使用时,会对多个数据库服务器进行访问,将访问句柄组织成链表进行管理。

封装后的函数有如下几个,函数名均已MY作为前缀:
其中的重要参数,MySQLConnLink是一个链表,其元素为MySQLConnection,该结构中包含了一个数据库连接相关的信息。如:数据库的账号,密码,数据库名字等 ...


Linux守护进程总结(2) : 实现

将一个普通进程改造成守护进程,需要下面几步:

一、fork子进程,退出父进程 - 为下一步创建新会话做准备
fork出的子进程必定与其父同组,且不是该组的首个进程,所以,子进程一定不是该组的组长进程。经过这一步操作,就去掉了进程的进程组组长身份,如果它是组长的话。

二、调用setsid创建新会话
要想使setsid顺利工作,必须要满足一个条件:调用进程不能是进程组的组长进程。这就是上一步工作的目的。

上面这两步是创建守护进程的核心步骤 ...


处理C字符串时应该注意到的

字符串是一系列字符的有序排列,一个挨着一个排成一串。若要对一个存放在内存中的字符串进行处理,需要知道其首个字符所在的内存地址和其边界。

对于边界的描述,容易想到的有两种方式:一是在字符串中给出该字符串的长度,知道了长度就可得出边界,像这样:

二是在字符串尾部加一个特殊的字符作为标记,只要看到这个字符,就可认定已经到达了字符串的边界,像这样:

这个字符应是不可打印的,以免与真正需要处理的那部分字符想混淆。

C语言使用的是第二种方法,它用ASCII码为0的字符(’\0 ...


共享内存小结

共享内存是一种高效的IPC机制。其做法是将两个或多个进程的某部分虚拟内存对应到相同的物理内存上去。这样,不同的进程只要发起对该部分虚拟内存的操作,实际上操作了同一块物理内存,进而可实现进程之间的交流。所谓共享内存,共享的就是这些物理内存空间。

这是简图,实际对应的物理内存未必是连续的。 操作系统能这么做,依赖于虚拟内存机制,而虚拟内存实际源于CPU的支持,确切地说是MMU这个硬件在起作用。MMU接到CPU发出的虚拟地址 ...


硬性关闭TCP连接

硬性关闭是指:使用非正常的手法立即终止当前TCP连接,只求关闭,不考虑后果,丢失数据也无所谓。这种方式在处理一些紧急状况时或许是必要的。

正常的关闭流程是在连接双方的配合下经历四次握手完成的。应用程序里的操作就是调用close接口。

对socket实施close操作,实际上会产生一个FIN报文段,这个段当然也要遵从TCP的规则,它会在发送缓冲区中排队。显然,调用close的一方要想实际发出这个FIN段,当然要先将排在它之前的那些字节发出去才行。也就是说,调用close后,到实际发出FIN之前,发送缓冲区中的数据已经发送到对端了。

上面说的是正常的关闭,用close接口即可发起。非正常关闭,也是用这个接口,只不过要配置一下socket的LINGER选项。

linger有“苟延残喘”的意思 ...