一些实用技巧与备忘

Linux 下的一些工具使用技巧

Linux 下查看进程端口号

netstat 查看时, 某些端口 OS 会显示不出来, 可以用 lsof 命令:

lsof -Pnl +M -i4 | grep LISTEN

GCC 查看系统宏定义

可以利用gcc的编译命令, 查看C的源文件扩展.

gcc -dM -E "c-file"

GDB 的一些小技巧

  1. set print pretty on 打开打印 pretty 开关, 在打印结构体时带缩进.
  2. disassemble 显示当前的汇编. disassemble /r 汇编带上机器码.
  3. info reg 显示寄存器的值.

SecureCRT 的一些小技巧

  • 保持链接: options -> global options -> General -> Default Session, 点击 Edit default settings 按钮, 在 Terminal 中钩上 Send protocol NO-OP, every 30 seconds.
  • 鼠标复制: options -> global options -> Terminal 钩上Copy on select, 并钩上 paste on middle button. 这样在secrecrt中用鼠标选中一段字符, 就可以直接复制到剪切板, 按鼠标中间的齿轮完成复制粘贴.
  • 常用快捷键:
    • ctrl + a: 移动光标到行首
    • ctrl + e:移动光标到行尾
    • ctrl + d:删除光标之后的一个字符
    • ctrl + w:删除行首到当前光标所在位置的所有字符
    • crtl + k:删除当前光标到行尾的所有字符

Linux iptables 开端口

Linux 一般通过 iptables 来管理开放端口, 修改 iptables 规则:

iptables -I INPUT -p tcp --dport 22 -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart

或者直接修改 /etc/sysconfig/iptables, 加上一行:

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

然后重启iptables即可.

其他备忘

memcpy 和 memmove

曾经测试过 Linux 下的 memcpy 和 memmove 性能, 平均下来 memcpy 会稍微快, 根据 size 不同会有些差异.

这两天修改了之前写的一个缓冲区的实现,这个缓冲区有个“排干”的操作,需要做一次内存拷贝,把缓冲区中的数据拷贝到头上,因为拷贝的数据可能会 overlap,所以只能 memmove。后来根据同事的经验,将做“排干”的策略做了调整,只有在缓冲区头上的留白超过一半 size 的时候才做“排干”,这个策略最初的目的是为了避免频繁的“排干”,但是有个超出预期的好处,就是可以保证“排干”拷贝内存时,不在可能有 overlap 的情况,所以就可以优化成 memcpy,提升稍许性能。

至于 memcpy 为什么比 memmove 快,可以参照源码实现: memmove 会检查一下是否有 overlap,在 dst < src 或者 dst >= src + size 时 FWD copy,否则就认为有 overlap,做 BWD copy。每次 copy 的时候,会调用汇编代码,按照位、字长或者页长来做拷贝,提高效率。memcpy 则直接 FWD 拷贝了。

TCP 缓冲区的设置

TCP 的缓冲区可以通过 SO_SNDBUF和SO_RCVBUF 来设置发送和接受缓冲区,这个缓冲区需要在建立连接之前设置,建立连接的时候, 连接双方会通过握手的过程获得对方的缓冲区 size.

具体来说,就是 client 需要在 connect 调用之前设置, server 需要在 listen 之前调用。如果在 connect 或者 listen 之后再设置缓冲区大小,因为 TCP 连接都建立好了,也就没有意义了。那么 accept 出来的 fd 呢?这个其实就是 listen 之前 server 设置的缓冲区大小,不需要再次设置,再次设置也是一样没有意义的。

strict weak order

stl 的一个需要注意的地方:重载比较函数时,遵循 strict weak order,即如果相等返回 false。在 std::sort 的 comp 参数说明中, 明确要求了这一点。更深入的理解可以参考这里.