如何查找Linux中一些特殊数据类型定义,比如pid_t和uid_t

  刚开始学习的时候看到像pid_t、uid_t这样的类型,总是想知道它的定义在哪,究竟是什么类型。但是直接看使用这些类型的函数的头文件根本就找不到。这里把我的一些经验分享给大家,希望有所帮助。

  下面以pid_t类型和getpid函数为例,getpid的定义如下:

       #include 
       #include 

       pid_t getpid(void);
       pid_t getppid(void);

这里面有两个头文件,但是一般情况下pid_t这个类型都在sys/types.h这个头文件中,所以先到这样的头文件中找。在sys/types.h头文件中搜索pid_t,可以找到下面的语句:

#ifndef __pid_t_defined
typedef __pid_t pid_t;
# define __pid_t_defined
#endif

可以看到pid_t类型其实就是__pid_t类型,但是在sys/types.h在头文件中没有找到__pid_t这个类型,这个时候应该怎么办呢?看sys/types.h中包含的头文件,即include语句,从这些语句中选择bits/types.h这个头文件,至于为什么这就牵涉到内核的一些类型定义的规则或者叫规律,但是一般按照先sys目录然后再bits目录都没有错。在bits/types.h头文件中可以找到下面的语句:

__STD_TYPE __PID_T_TYPE __pid_t;    /* Type of process identifications.  */

也就是说__pid_t其实是__PID_T_TYPE类型,而这个类型在哪定义呢?也是先看include语句,选择bits/typesizes.h头文件,也是经验,从这个头文件中就可以找到下面的语句:

#define __PID_T_TYPE        __S32_TYPE

也就是说__PID_T_TYPE其实是__S32_TYPE类型。而这个类型在bits/typesize.h中找不到,而且这个头文件中也没有include语句,这个时候怎么办呢?还去bits/types.h中找,可以找到下面的语句:

#define __S32_TYPE      int

至此,终于找到了,pid_t其实就是int类型。

总结一下,找一个类型,一般的过程就是(比如从xxx.h开始):

xxx.h----->sys/xxx.h----->bits/xxx.h----->bits/types.h和bits/typesize.h

或者有时还要去asm目录和asm-generic目录中的头文件中找。还有一种方式就是在linux内核源码中找,但是可能某些同学感觉不爽,哈哈!

 

虽然我写这篇文章告诉你怎么找一些特殊类型,但是强烈建议初学者你不要总是这么寻根究底地查找某些类型的定义,因为这些完全没有意义,你只要知道他是什么类型就行,怎么用就可以,把跟多的精力投入到一些全局的东西,不要总是抠细节,那是在你学到一定程度之后要做的。



你可能感兴趣的:(Linux内核,C语言,网络编程)