VimStudio


VimStudioVim及一些常用插件(主要针对C/C++语言)打包在一起,通过执行install.py完成安装,免去了安装配置插件的麻烦。项目地址:https://github.com/xushvai/VimStudio 

VimStudio不会对当前的Vim ...


逐步实现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,该结构中包含了一个数据库连接相关的信息。如:数据库的账号,密码,数据库名字等 ...


C/C++单出口函数的写法

如果一个函数有多个出口(return),在函数内进行加解锁操作就会比较繁琐。万一在某个出口处忘记解锁,就为死锁做了准备。

为避免此类问题,最好让函数只有单一的出口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int Example()
{
    int cond = 0;

    ... ...

    if (1 == cond) {
        return ERR_1;
    }

    ... ...

    if (2 == cond) {
        return ERR_2;
    }

    ... ...

    if (3 == cond) {
        return ERR_3;
    }

    ... ...

    return SUCCESS;
}

第一种写法 ...


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

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

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

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

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


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

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

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

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

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

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