转自:http://www.cnblogs.com/wenhuisun/archive/2012/07/07/2580643.html

Ssize_t 与size_t

跟踪linux源码得到以下宏:

 

#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

 

在不同平台上,其具有不同的定义:

/* 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 类型

GitHub 加速计划 / li / linux-dash
13
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐