Articles

  • Linux 网络模型

    全文针对linux环境。tcp/udp两种server种,tcp相对较复杂也相对比较常用。本文就从tcp server开始讲起。先从基本说起,看一个单线程的网络模型,处理流程如下:

    socket-->bind-->listen-->[accept-->read-->write-->close]-->close
    

    []中代码循环运行,[]外的是对监听socket的处理,[]内的是对accept返回的客户socket的处理。这些系统调用的参数以及需要的头文件等,只需要在linux下man就好。

  • Linux Assemble Language

    Table of Contents

  • /usr/bin/install

    Introduction

    install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。

    Syntax

    install [OPTION]... [-T] SOURCE DEST
    install [OPTION]... SOURCE... DIRECTORY
    install [OPTION]... -t DIRECTORY SOURCE...
    install [OPTION]... -d DIRECTORY...
    

    在前两种格式中,会将复制至或将多个文件复制至已存在的,同时设定

    权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。

  • C\C++ string

    using namespace std;
    
    string num[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    string suf[] = {"shi", "bai", "qian", "wan", "yi"};
    vector<string> v;
    
    string n2s(const string& n) {
        int l = n.length();
        if (l == 1) {
            return num[n[0]-'0'];
        } else if (n[0] == '0' && n[1] == '0') {
            return num[n[0]-'0'] + n2s(n.substr(2, l-2));
        } else {
            return num[n[0]-'0'] + (n[0] == '0' ? "" : suf[l-2])
                + n2s(n.substr(1, l-1));
        }
    }
    
    string ln2s(const string& n) {
        int l = n.length();
        if (l < 5) {
            return n2s(n);
        } else if (l < 9) {
            return n2s(n.substr(0, l-4)) + "wan" + n2s(n.substr(l-4, 4));
        } else {
            return n2s(n.substr(0, l-8)) + "yi" + ln2s(n.substr(l-8, 8));
        }
    }
    
    int test() {
        cout << n2s("1001") << endl;
        cout << n2s("1010") << endl;
        cout << n2s("1101") << endl;
        cout << ln2s("11101") << endl;
        cout << ln2s("101101") << endl;
        cout << ln2s("1101") << endl;
        return 0;
    }
    
  • C\C++ sizeof

    关于sizeof的一般性的问题比较多见, 需要强调的是,sizeof运算符的计算是发生在编译期的。 以下讨论几点细节和实现方法。

  • Read Lua Source Code

    Lua logo Lua logo

    介绍

    Lua 应用比较广泛,主要是作为插件解释器。例如mysql proxy,VLC 等。Lua 源代码比较规范,代码也不长,2w 多行,分布也是比较均匀的,就想看一看,顺便在这里做个笔记。

  • POSIX Threads

    Introduction

    This article describes some aspects of using pthreads.

    POSIX (可移植操作系统接口) 线程是提高代码响应和性能的有力手段。

    线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。

  • The Architecture of Open Source Applications

    介绍

    最近在看 The Architecture of Open Source Applications,顺便翻译了一些我比较有兴趣的文章。以下是目录1,不定期更新:

    1. nginx
    2. LLVM
    3. The Bourne-Again Shell

     

    声明

    说明

    1. 其中橘红色表示只翻译了一部分,等待进一步翻译和校对。绿色表示已经校对。未做标记的是已经翻译完成,但是没有校对。
  • LLVM

    英文作者:Chris Lattner

    原文链接:LLVM

    许可协议:Creative Commons License

    这一章讨论一些有关构成 LLVM1 的设计决策,是一个 umbrella 项目承载和开发了一套联系紧密低级工具链组件(例如, 汇编器、编译器、调试器等等),被设计来与 Unix 系统上的存在的工具保持兼容。名称 "LLVM" 曾今是一个首字母缩写,但是现在只是 umbrella 项目的商标(brand)。同时 LLVM 也提供一些独有的能力,也因为一些伟大的工具(例如 Clang2 编译器,是一个相比 GCC 有很多优点的 C/C++/Objective-C 编译器),使得 LLVM 同其他编译器区别开来的主要是它的内部架构。

    从2000年十二月开始,LLVM 被设计作为一套具有良好定义接口的可重用库[LA04]。在那个时候,开源编程语言的实现被设计作为特殊目的的工具,通常具有单个可执行文件。例如,从一个静态编译器(例如 GCC)重用解析器(parser)来做静态分析和重构是非常困难的。同时脚本语言经常提供一种把它们的运行时和解释器(runtime and interpreter)嵌入到更大的应用程序之中的方法,这个运行时就是一个单独的代码块被包含或者排除。没有方法可以做到跨语言实现的重用和共享。

  • The Bourne-Again Shell

    英文作者:Chet Ramey

    原文链接:The Bourne-Again Shell

    3.1. 介绍

    一个 Unix shell 提供了一个用户通过运行命令来和系统交互的接口。但是一个 shell 也是一门相当丰富的编程语言:具有流程控制、修改、循环、条件、基本的数学操作,命名函数、字符串变量和 shell 与它运行的命令之间的双向通信。

    shells 可以交互使用,从终端或者终端模拟器例如xterm,也可以非交互使用,从文件中读取命令。大多数现代shells, 包括 bash, 提供命令行编辑 command-line editing, 使得命令行输入的时候可以使用类似 emacs 或者 vi 的命令进行编译,具有不同的命令历史记录。

    bash 处理更像一个shell管道:在从终端或者脚本中读取之后,数据被传送经过一系列阶段,在每一个阶段中进行变换,直到shell最终执行一个命令并手机它的返回状态。