sys/types.h sys/types.h中文名稱為基本系統數據類型。
在應用程序源文件中包含 以訪問 _LP64 和 _ILP32 的定義。
此頭文件還包含適當時應使用的多個基本派生類型。尤其是以下類型更為重要:
caddr_t 核心地址。
clock_t 表示系統時間(以時鐘周期為單位)。
comp_t 壓縮的時鐘滴答。
dev_t 用于設備號。
fd_set 文件描述集。
fpos_t 文件位置。
gid_t 數組值ID.
ino_t i節點編號。
off_t 用于文件大小和偏移量。
mode_t 文件類型,文件創建模式。
pid_t 進程ID和進程組ID
ptrdiff_t 是一種帶符號整型,用于對兩個指針執行減法運算后所得的結果。
rlim_t 資源限制;
size_t 反映內存中對象的大小(以字節為單位)。
ssize_t 供返回字節計數或錯誤提示的函數使用。
time_t 以秒為單位計時。
uid_t 數值用戶ID.
wchar_t 能表示所有不同的字符碼。
所有這些類型在 ILP32 編譯環境中保持為 32 位值,并會在 LP64 編譯環境中增長為 64 位值。
實例:
pid_t int 型
pid_t的類型定義 創建進程時經常會用到進程號的類型定義:pid_t.我們都知道這個類型定義實際上就是int型。但是在linux下的c中的頭文件中這個定義到底是怎么定義的呢?今天就把以前找這個定義的過程貼出來:
1.首先在/usr/include/sys/types.h中有如下定義
#include
……
#ifndef __pid_t_defined
typedef __pid_t pid_t;
# define __pid_t_defined
#endif
可以看到pid_t 其實就是__pid_t類型。
2.在/usr/include/bits/types.h中可以看到這樣的定義
#include
#if __WORDSIZE == 32
……
# define __STD_TYPE __extension__ typedef
#elif __WORDSIZE == 64
……
#endif
……
__STD_TYPE __PID_T_TYPE __pid_t; /* Type of process identifications. */
可以看出__pid_t 有被定義為 __extension__ typedef __PID_T_TYPE類型的。
3.在文件/usr/include/bits/typesizes.h中可以看到這樣的定義(這個文件中沒有包含任何的頭文件):
#define __PID_T_TYPE __S32_TYPE
可以看出__PID_T_TYPE有被定義為__S32_TYPE這種類型。
4.在文件/usr/include/bits/types.h中我們終于找到了這樣的定義:
#define __S32_TYPE int
由此我們終于找到了pid_t的真實定義:實際他就是 int 類型的。
其實很多類似于這種類型的定義,就是為了不同的操作系統,不同的處理器方便吧,無非是long int unsigned 之類的
原文出自【比特網】,轉載請保留原文鏈接:http://soft.chinabyte.com/os/51/12386551.shtml
當Linux內核在體系結構差異較大的平臺之間移植時,會產生與數據類型相關的問題。
.在編譯內核時使用 -Wall? -W strict-prototypes 選項, 可以避免很多錯誤的發生
.內核使用的基本數據類型主要有:
int?????????? 標準C語言整數類型
u32???????? 32位整數類型
pid_t?????? 特定內核對象pid的類型
.在不同的CPU體系結構上,C語言的數據類型所占空間不一樣。
arch
char
short
int
long
ptr
long-long
u8
u16
u32
u64
i686
1
2
4
4
4
8
1
2
4
8
i386
1
2
4
4
4
8
1
2
4
8
alpha
1
2
4
8
8
8
1
2
4
8
armv41
1
2
4
4
4
8
1
2
4
8
ia64
1
2
4
8
8
8
1
2
4
8
m68k
1
2
4
4
4
8
1
2
4
8
mips
1
2
4
4
4
8
1
2
4
8
ppc
1
2
4
4
4
8
1
2
4
8
sparc
1
2
4
4
4
8
1
2
4
8
sparc64
1
2
4
4
4
8
1
2
4
8
.內核中的地址是unsigned long類型, 指針大小和long類型相同
.內核提供下列數據類型, 所有類型在頭文件中聲明, 這個文件又被頭文件所包含, 下面是 include/asm/typs.h文件
[File] /usr/src/kernels/2.6.9-22.EL-i686/include/asm-i386/types.h
#ifndef _I386_TYPES_H
#define _I386_TYPES_H
#ifndef __ASSEMBLY__
typedef unsigned short umode_t;
/*
* __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
* header files exported to user space
*/
typedef __signed__ char
__s8
;
typedef unsigned char
__u8
;
typedef __signed__ short
__s16
;
typedef unsigned short
__u16
;
typedef __signed__ int
__s32
;
typedef unsigned int
__u32
;
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __signed__ long long
__s64
;
typedef unsigned long long
__u64
;
#endif
#endif /* __ASSEMBLY__ */
/*
* These aren't exported outside the kernel to avoid name space clashes
*/
#ifdef __KERNEL__
#define BITS_PER_LONG 32
#ifndef __ASSEMBLY__
#include
typedef signed char
s8
;
typedef unsigned char
u8
;
typedef signed short
s16
;
typedef unsigned short
u16
;
typedef signed int
s3
2;
typedef unsigned int
u32
;
typedef signed long long
s64
;
typedef unsigned long long
u64
;
/* DMA addresses come in generic and 64-bit flavours.? */
#ifdef CONFIG_HIGHMEM64G
typedef u64
dma_addr_t
;
#else
typedef u32
dma_addr_t
;
#endif
typedef u64
dma64_addr_t
;
#ifdef CONFIG_LBD
typedef u64
sector_t
;
#define HAVE_SECTOR_T
#endif
typedef unsigned short
kmem_bufctl_t
;
#endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */
#endif
[File] /usr/src/kernels/2.6.9-22.EL-i686/include/linux/types.h
#ifndef _LINUX_TYPES_H
#define _LINUX_TYPES_H
#ifdef??? __KERNEL__
#include
#define BITS_TO_LONGS(bits) /
(((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
#define DECLARE_BITMAP(name,bits) /
unsigned long name[BITS_TO_LONGS(bits)]
#endif
#include
#include
#ifndef __KERNEL_STRICT_NAMES
typedef __u32
__kernel_dev_t;
typedef __kernel_fd_set
fd_set
;
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 __kernel_uid32_t
uid_t
;
typedef __kernel_gid32_t
gid_t
;
typedef __kernel_uid16_t
uid16_t
;
typedef __kernel_gid16_t
gid16_t
;
#ifdef CONFIG_UID16
/* This is defined by include/asm-{arch}/posix_types.h */
typedef __kernel_old_uid_t
old_uid_t
;
typedef __kernel_old_gid_t
old_gid_t
;
#endif /* CONFIG_UID16 */
/* libc5 includes this file to define uid_t, thus uid_t can never change
* when it is included by non-kernel code
*/
#else
typedef __kernel_uid_t
uid_t
;
typedef __kernel_gid_t
gid_t
;
#endif /* __KERNEL__ */
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __kernel_loff_t??? ??? loff_t;
#endif
/*
* The following typedefs are also protected by individual ifdefs for
* historical reasons:
*/
#ifndef _SIZE_T
#define _SIZE_T
typedef __kernel_size_t
size_t
;
#endif
#ifndef _SSIZE_T
#define _SSIZE_T
typedef __kernel_ssize_t
ssize_t
;
#endif
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef __kernel_ptrdiff_t
ptrdiff_t
;
#endif
#ifndef _TIME_T
#define _TIME_T
typedef __kernel_time_t
time_t
;
#endif
#ifndef _CLOCK_T
#define _CLOCK_T
typedef __kernel_clock_t
clock_t
;
#endif
#ifndef _CADDR_T
#define _CADDR_T
typedef __kernel_caddr_t
caddr_t
;
#endif
/* bsd */
typedef unsigned char
u_char
;
typedef unsigned short
u_short
;
typedef unsigned int
u_int
;
typedef unsigned long
u_long
;
/* sysv */
typedef unsigned char
unchar
;
typedef unsigned short
ushort
;
typedef unsigned int
uint
;
typedef unsigned long
ulong
;
#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__
typedef??? ??? __u8
u_int8_t
;
typedef??? ??? __s8
int8_t
;
typedef??? ??? __u16
u_int16_t
;
typedef??? ??? __s16
int16_t
;
typedef??? ??? __u32
u_int32_t
;
typedef??? ??? __s32
int32_t
;
#endif /* !(__BIT_TYPES_DEFINED__) */
typedef??? ??? __u8
uint8_t
;
typedef??? ??? __u16
uint16_t
;
typedef??? ??? __u32
uint32_t
;
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef??? ??? __u64
uint64_t
;
typedef??? ??? __u64
u_int64_t
;
typedef??? ??? __s64
int64_t
;
#endif
/*
* The type used for indexing onto a disc or disc partition.
* If required, asm/types.h can override it and define
* HAVE_SECTOR_T
*/
#ifndef HAVE_SECTOR_T
typedef unsigned long
sector_t
;
#endif
/*
* The type of an index into the pagecache.? Use a #define so asm/types.h
* can override it.
*/
#ifndef pgoff_t
#define
pgoff_t
unsigned long
#endif
#ifdef __CHECKER__
#define __bitwise __attribute__((bitwise))
#else
#define __bitwise
#endif
typedef __u16
__bitwise __le16
;
typedef __u16
__bitwise __be16
;
typedef __u32
__bitwise __le32
;
typedef __u32
__bitwise __be32
;
typedef __u64
__bitwise __le64
;
typedef __u64
__bitwise __be64
;
#endif /* __KERNEL_STRICT_NAMES */
/*
* Below are truly Linux-specific types that should never collide with
* any application/library that wants linux/types.h.
*/
struct
ustat
{
__kernel_daddr_t
f_tfree
;
__kernel_ino_t
f_tinode
;
char
f_fname[6]
;
char
f_fpack[6]
;
};
#endif /* _LINUX_TYPES_H */