size_t ssize_t loff_t 的區別

Ssize_t 與size_tlinux

跟蹤linux源碼獲得如下宏:函數

 

#ifndef _SIZE_Tpost

#define _SIZE_Tspa

typedef __kernel_size_t         size_t;blog

#endif源碼

 

#ifndef _SSIZE_Tit

#define _SSIZE_Tio

typedef __kernel_ssize_t       ssize_t;ioc

#endiffile

 

在不一樣平臺上,其具備不一樣的定義:

/* sparc 64 bit */

typedef unsigned long          __kernel_size_t;

typedef long                   __kernel_ssize_t;

 

/* sparc 32 bit */

typedef unsigned int           __kernel_size_t;

typedef int                    __kernel_ssize_t;

這就是兩個類型的實際定義,從字面上意思來講:

       Ssize_t = signed size_t

 

使用位置:

       在對於緩衝區大小等等非負值的長度時通常使用 size_t;

       而對於像

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

       ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

       ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

       ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

可能失敗返回< 0的函數時,則使用ssize_t;

 

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

另外類似的一個類型: loff_t

定義以下:

       #if defined(__GNUC__)

typedef __kernel_loff_t         loff_t;

#endif

是一個long long 類型

#ifdef __GNUC__

typedef long long       __kernel_loff_t;

#endif

 

注重細節,總有一天會成功!

————————————————————華麗的分割線————————————————————————————————

 

 

我的小總結:

size_t  爲 unsigned  long/int 類型

ssize_t 爲 long/int 類型 

總而言之  ssize_t  =  signed  size_t

loff_t 爲 long long 類型

相關文章
相關標籤/搜索