Intelligence without ambition is a bird without wings.

2015-02-05
跟踪应用程序执行的系统调用

strace program
阅读此文

2015-02-05
检查linux是否支持netlink

  • 检查/proc/net/netlink是否存在

  • cat /proc/net/protocols是否有NETLINK

参考

  1. http://stackoverflow.com/questions/24284255/is-there-any-user-level-command-to-check-whether-a-kernel-image-is-supporting-ne
阅读此文

2015-02-05
getaddrinfo开启c99后无法编译

原因

开启了c99后,gcc采用严格标准c(__STRICT_ANSI),而getaddrinfo是POSIX定义的,
所以无法使用,具体可查看/usr/include/netdb.h/usr/include/features.h

摘取:

1
2
3
4
5
6
7
8
The `-ansi' switch to the GNU C compiler, and standards conformance
options such as `-std=c99', define __STRICT_ANSI__. If none of
these are defined, or if _DEFAULT_SOURCE is defined, the default is
to have _SVID_SOURCE, _BSD_SOURCE, and _POSIX_SOURCE set to one and
_POSIX_C_SOURCE set to 200809L. If more than one of these are
defined, they accumulate. For example __STRICT_ANSI__,
_POSIX_SOURCE and _POSIX_C_SOURCE together give you ISO C, 1003.1,
and 1003.2, but nothing else.

参考

  1. https://groups.google.com/d/msg/gnu.gcc.help/a88eE4Ga73o/P3vji9iM5pwJ
阅读此文

2015-02-05
gcc选项简记

  • -D name=definition

    指定预处理宏定义,相当于#define name definition

  • -std=XXX

    • c99
    • c++11
  • -M

    输出依赖关系,隐含-E,也就是不编译,只是查看依赖关系,依赖关系包含系统头文件

  • -MM

    输出依赖关系,只是用户的,不包含库文件

  • -MF file

    依赖关系的结果输出到指定文件中,必须指定-M或-MM

  • -MD

    相当于-MM -MF .d ,
    输出依赖关系,不隐含-E,也就是同时生成依赖文件(
    .d),还编译,依赖关系中包含
    系统头文件

  • -MMD

    相当于-MD,生成的*.d中不包含系统头文件

  • -MT file

    使用file中的依赖关系编译,也就是配合-MMD或-MD或-MF来使用,使用他们生成的依赖
    关系自动编译

  • -MP

    连头文件也输出对应的依赖关系,可能为伪目标,防止删除了头文件,而没有更新
    makefile导致编译错误

  • -Ldir

    添加dir到目录列表,目录列表用来搜索链接库

  • -llibrary

    指定链接库,优先寻找共享库(liblibrary.so,liblibrary.a),该选项最好放到最后,
    防止后面需要链接的,详见gcc(1)

  • -static

    指定链接静态库

  • -fPIC

    生成位置无关代码(position independent code)

  • -shared

    生成共享库,需要-fPIC

  • -Idir

    添加目录到搜索头文件列表,添加的优先搜索

  • -Wl,

    向链接器传递选项,’,’隔开选项

  • -Wa,

    向汇编器传递选项,’,’隔开选项

  • -Wp,

    向预处理器传递选项,’,’隔开选项

  • -O

    不开启优化

调试

  • -ggdb3

    生成gdb的调试信息,带宏相关

阅读此文

2015-02-04
linux优秀书籍列表

阅读此文

2015-02-04
BSD-tcp-ip头文件组织

| 头文件 | 作用 |
|——————+————————————————–|
| <sys/socket.h> | 核心socket API和数据结构 |
| <netinet/in.h> | IPv4,IPv6等相关协议族地址结构定义,常用端口定义 |
| <arpa/inet.h> | IP地址操作 |
| <netdb.h> | 网络数据库查询,如主机名,服务等 |

参考

  1. http://en.wikipedia.org/wiki/Berkeley_sockets#Header_files
阅读此文

2015-02-03
grep

  • -C num

    指定上下文行数

  • -B NUM, –before-context=NUM

    指定上文行数

  • -A NUM, –after-context=NUM

    指定下文行数

  • -m NUM, –max-count=NUM

    指定最大匹配数量

  • -n, –line-number

    显示行号

  • -o, –only-matching

    只输出匹配的内容(默认输出匹配内容所在的整行)

实例

  • grep指定日期的文件

    find . -newermt 2016-11-19 ! -newermt 2016-11-20|xargs grep -i AH7GJ5SFCQ
    
阅读此文

2015-02-03
linux-socket寻址

环境

  • ubuntu-14.04

  • glic-2.19

  • 工作目录:/usr/include

数据结构

struct sockaddr

socketAPI接口,无关具体地址族,协议。

定义位置

x86_64-linux-gnu/sys/socket.h => x86_64-linux-gnu/bits/socket.h

1
2
3
4
5
6
/* Structure describing a generic socket address.  */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};

Note:

  • =>表示包含

strcut sockaddr_in

具体类型数据结构,用来操作地址族,IP,端口。

定义位置

netinet/in.h

1
2
3
4
5
6
7
8
9
10
11
12
13
/* Structure describing an Internet socket address.  */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */

/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};

struct in_addr

定义IP

定义位置

netinet/in.h

1
2
3
4
5
6
/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};

关系

in_addr => sockaddr_in => sockaddr

Note:

  • =>表示构成

说明

socket地址结构传递方向

  • 从进程到内核

    需要传入参数(套接字地址大小,告诉内核需要复制多少字节)

    • bind
    • connect
    • sendto
    • sendmsg
  • 从内核到进程

    需要传入传出参数(套接字地址大小,告诉内核需要复制多少字节,以及反馈进程,返回的地址结构大小)

    • accept
    • recvfrom
    • recvmsg
    • getpeername
    • getsockname
阅读此文

2015-02-03
gcc获取include路径列表

C

echo | gcc -v -x c -E -

C++

echo | g++ -v -x c++ -E -
阅读此文

2015-02-03
ubuntu-包管理

apt-get

  • 只下载不安装(二进制包)

    apt-get download PACKAGE
    
  • 下载源代码

    apt-get source PACKAGE
    

apt-cache

  • 查询包依赖(该包依赖哪些包)

    apt-cache depends PACKAGE
    
  • 查询反向依赖(哪些包依赖该包)

    apt-cache rdepends PACKAGE
    
  • 查询包信息(基本信息,依赖信息)

    apt-cache showpkg PACKAGE
    apt-cache show PACKAGE
    
  • 查看包版本

    apt-cache policy PACKAGE
    
  • 搜索包

    apt-cache search PATTERN
    

apt-file(需要安装)

  • 列出包文件列表

    apt-file list PACKAGE
    
阅读此文