Articles

  • Linux 网络模型

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

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

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

  • /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 多行,分布也是比较均匀的,就想看一看,顺便在这里做个笔记。

  • 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最终执行一个命令并手机它的返回状态。

  • nginx

    英文作者: Andrew Alexeev

    英文链接:nginx

    nginx(发音"engine x")是俄罗斯软件工程师Igor Sysoev开发的免费开源web服务器软件。nginx于2004年发布,专注于高性能,高并发和低内存消耗问题。并且具有多种web服务器功能特性:负载均衡,缓存,访问控制,带宽控制,以及高效整合各种应用的能力,这些特性使nginx很适合于现代网站架构。目前,nginx已经是互联网上第二流行的开源web服务器软件。

  • Linux poll

    介绍

    本篇为 Linux I/O 事件通知机制系列第二篇,介绍 poll。 其他两篇为: