下面以查找结构体FILE的原始定义为例:
1、我们知道,这些定义一般都在 /usr/include下面,所以首先到达目录 /usr/include 下面
2、用grep命令搜索 ,即grep FILE stdio.h,可得以下结果(部分),FILE在stdio.h中定义有好多地方提到过。
#if !defined __need_FILE && !defined __need___FILE
# define __need_FILE
# define __need___FILE
#endif /* Don\"t need FILE. */
#if !defined __FILE_defined && defined __need_FILE
struct _IO_FILE;
typedef struct _IO_FILE FILE;
#if defined __USE_LARGEFILE64 || defined __USE_SVID || defined __USE_POSIX \
__USING_NAMESPACE_STD(FILE)
3、从上面的搜索结果可以看到,实际上是把 _IO_FILE 定义为FILE,于是又要查找 _IO_FILE的定义。
4、用grep命令,即执行 grep \"_IO_FILE\" *.h,得到以下结果(部分,因为全部太多了,我们要从大量的结果中找到关键内容,当然也可以通过管道 二次使用grep)
_G_config.h:#define _G_HAVE_IO_FILE_OPEN 1
_G_config.h:#define _G_IO_IO_FILE_VERSION 0x20001
libio.h:struct _IO_jump_t; struct _IO_FILE;
libio.h: struct _IO_FILE *_sbuf;
libio.h:struct _IO_FILE {
libio.h: struct _IO_FILE *_chain;
libio.h:#ifdef _IO_USE_OLD_IO_FILE
5、我们看到了libio.h:struct _IO_FILE { 这一行,所以知道 它是在libio.h中定义的,打开该文件,即可看到定义。
注意:有时候有些宏定义还会调用其他的宏定义,如在中有如下定义: #define S_IRUSR __S_IREAD ,__S_IREAD本身也是个宏,我们不知道它定义在何处,可以用之前的方法继续寻找__S_IREAD,但有时候会在/usr/include/的子文件夹下,这时候就不好寻找了,通常我们看到 #define S_IRUSR __S_IREAD 这样的定义,可以沿着此语句往代码的前方找,看到的第一个#include文件,如, __S_IREAD 就是在这个文件下定义的,然后查找此文件,可以看到如下声明:#define __S_IREAD 0400 /*Read by owner.*/
linux内核头文件/usr/include/ 目录下的.h文件中会include其它头文件,但通常不会把调用的其它头文件列在一起,而是include一个头文件之后,紧接着的语句是会用到这个头文件中的宏,或其它声明的变量,函数,结构体等等。
而linux内核源码中的.c文件等会把所有调用的文件列在程序的开头。如/usr/src/kernel/linux-2.6.38.6/mm/memory.c程序开头如下:
#include
#include
#include
#include
#include
..................