Intelligence without ambition is a bird without wings.

2015-08-05
mod_fcgid

通信机制

unix域套接字

netstat -lxnp
阅读此文

2015-08-05
linux-管道

限制

  • 只能在具有亲缘关系的进程间使用

  • 历史上,都是半双工的

要点

  • 对管道写,不大于PIPE_BUF(/usr/include/linux/limits.h => 4K)时,可以保证不会与其他进程的写操作穿插(原子写)

与普通文件差异

  • 管道的缓冲区固定大小(4K),不会像文件一样无限增长

    • 当管道满时,调用write会被阻塞
    • 当管道空时,调用read也会被阻塞
  • 管道读是一次性的,一旦被读,就被丢弃

实现原理

在Linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。
通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。

图中有两个 file 数据结构,但它们定义文件操作例程地址是不同的.
其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。
这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。

参考

  1. http://oss.org.cn/kernel-book/ch07/7.1.1.htm
阅读此文

2015-08-04
gdb

etc

  • 自定义初始化设置

    ~/.gdbinit
    
  • 载入配置文件

    source ~/.gdbinit
    

启动

  • 通过文件名

    gdb <program>
    
  • 使用core调试

    gdb -c <core-file-name> <program>
    
  • attach到指定进程

    gdb -p <pid>
    gdb attach <pid>
    

多线程调试

  • 查看当前所有线程

    info threads
    
  • 查看所有线程调用栈

    thread apply all bt
    
  • 调试指定线程

    thread <thread-num>
    
  • 锁定线程(阻止线程切换)

    set scheduler-locking on
    

控制类

  • 运行到指定行

    until $line-number
    

断点

  • 在指定文件指定行

    break filename:linenum
    
  • 删除断点

    clear linenum
    

栈切换

  • 根据编号切换

    frame n
    
  • 向上

    up <num>
    

查询类

  • 打印调用栈

    bt
    where
    
  • 打印当前帧(查询当前执行语句位置)

    frame
    
  • 打印当前行

    list *$pc
    
  • x(examine)

    x /[nfu] ADDRESS(若ADDRESS是一个变量,则认为变量值为要查看的地址)
    n用来指定重复的次数,就是指定显示格式和size确定的一个单位多少次
    #n默认为1

    f用来指定显示的格式,同print一样

    Format letters
    o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary),
    f(float), a(address), i(instruction), c(char) and s(string)
    

    u(unit),指定一个单位的长度

    Size letters
    b(byte), h(halfword, 2B), w(word, 4B), g(giant, 8 bytes)
    

    x/3uh 0x54320

    从0x54320开始,以(h)2B为单位,(u)无符号十进制输出,显示3uh个这样的单
    位,总共显示2 × 3 = 6B的内存
    

    x /10s *argv 查看环境变量

set

  • set args ARG-list

    设置程序的命令行参数,依次传给argv[1],…
    #需要在文件载入之后,程序开始执行之前

  • set print pretty

    可爱的打印出结构体

  • set print elements 0

    完全打印元素,不管有多少(查看该选项值,show print elements)

gdb打印STLhttps://sourceware.org/gdb/wiki/STLSupport

  • 查看宏定义以及位置
info macro <macro>
  • 展开宏

    macro expand <macro>
    
阅读此文

2015-07-29
c++-文件读写

fstream

  • 默认读写打开

    • 从文件开始读
    • 从文件末尾写
阅读此文

2015-07-28
后台开发经验

  1. 撤单回退资金,双重校验(传入的UID, 订单关联的UID)

  2. 增量拉取

    • 确定前端排序规则(排序键)

    • 传入(排序键值, 拉取个数)

  3. 错误处理

    • 请求参数严格校验(防止执行时导致内部错误)
    • SQL错误结合接口意义,返回客户端错误提示
  4. 保持app原版本兼容时,相关数据表,追加版本号

阅读此文

2015-07-27
c-获取各种级别时间值

  • 秒级别

    time()
    
  • 微秒

    gettimeofday()
    
  • 纳秒

    clock_gettime()
    
阅读此文

2015-07-24
python-日期加减操作

1
2
3
datetime.date.today() + datetime.timedelta(days=1)
today = datetime.date.today() + datetime.timedelta(days=1)
period = int(today.strftime("%Y%m%d"))

参考

  1. http://stackoverflow.com/questions/1506901/cleanest-and-most-pythonic-way-to-get-tomorrows-date
阅读此文

2015-07-24
git-常用命令

选项

  • –git-dir 指定.git目录

  • –work-dir 指定工作目录

常用命令

  • 丢弃未缓存的修改

    git checkout -- order.cpp
    
  • 默认推送所有分支和tag

    git push --all origin -u
    
  • 迁出到指定目录

    git --work-tree=../v0.03 checkout v0.03 .
    
阅读此文

2015-07-23
linux-进程后台运行

  • nohub

    nohup ping www.google.com &

阅读此文

2015-07-23
boost-lexical_cast

  • 不能转换空字符串!(需要捕获异常)

    try {
        boost::lexical_cast<int>("");
    } catch (boost::bad_lexical_cast &e) {
        ;
    }
    
阅读此文