POSIX-Portable Operating System Interface for
Unix,要求C语言库的头文件为每个实现POSIX的机器定义一个一致的类型集。其中的每一个类型定义很容易与本地C语言区分开来,因为它们都以_t结尾。
typedef
__kernel_dev_t dev_t;
typedef
__kernel_ino_t ino_t;
typedef
__kernel_mode_t mode_t;
typedef
__kernel_nlink_t nlink_t;
typedef
__kernel_off_t off_t;
typedef
__kernel_pid_t pid_t;
typedef
__kernel_daddr_t daddr_t;
typedef
__kernel_key_t key_t;
typedef
__kernel_suseconds_t suseconds_t;
typedef
__kernel_timer_t timer_t;
typedef
__kernel_clockid_t clockid_t;
typedef
__kernel_mqd_t mqd_t;
#ifdef __KERNEL__
typedef
_Bool bool;
typedef
__kernel_uid32_t uid_t;
typedef
__kernel_gid32_t gid_t;
typedef
__kernel_uid16_t uid16_t;
typedef
__kernel_gid16_t gid16_t;
typedef unsigned
long uintptr_t;
#ifdef CONFIG_UID16
typedef
__kernel_old_uid_t old_uid_t;
typedef
__kernel_old_gid_t old_gid_t;
#endif
#else
typedef
__kernel_uid_t uid_t;
typedef
__kernel_gid_t gid_t;
#endif
typedef
__kernel_size_t size_t;
#ifndef _SSIZE_T
#define _SSIZE_T
typedef
__kernel_ssize_t ssize_t;
#endif
typedef unsigned
long __kernel_ino_t;
typedef unsigned
short __kernel_mode_t;
typedef unsigned
short __kernel_nlink_t;
typedef
long __kernel_off_t;
typedef
int __kernel_pid_t;
typedef unsigned
short __kernel_ipc_pid_t;
typedef unsigned
short __kernel_uid_t;
typedef unsigned
short __kernel_gid_t;
typedef unsigned
int __kernel_size_t;
typedef
int __kernel_ssize_t;
typedef
int __kernel_ptrdiff_t;
typedef
long __kernel_time_t;
typedef
long __kernel_suseconds_t;
typedef
long __kernel_clock_t;
typedef
int __kernel_timer_t;
可以看出,为了方便数据的移植和统程的统一,在include/linux/types.h中,内核定义了类型的别名,内核可以使用*_t(如dev_t)来统一编程。然后在相关的架构里面对别名进行数据结构的具体定义。
简要地分析几个例子:
1) dev_t
一个包含major和minor的算术类型。对于特定的设备文件,通常可以在/dev子目录下找到。在linux下,一个dev_t可以通过major(),minor(),以及mkdev()宏来操作,这些都可以在中找到。
2) uid_t,gid_t
整数类型,分别保存惟一的ID号或者组ID编号。
3) pid_t
整数类型,为系统每一个进程提供惟一值。
4) id_t
可以涵盖任务pid_t,uid_t或者gid_t的整数类型,不能分割来使用。
5) off_t
有符号整型,以字节为单位度量文件大小。
6) size_t
无符号整数,度量一个内存对象的大小。例如,一个字符串、数组或者缓冲区。
7) ssize_t
有符号整数,它可以表示字节数(正),或者返回错误码(负)。