对于赶时间的朋友,只看第一段就好了。
   首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t 就是无符号型的ssize_t,也就是unsigned long/ unsigned int (在32位下),不同的编译器或系统可能会有区别,主要是因为在32位机器上int和long是一样的。在64位没有测试,但是参见百度百科,size_t 在64位下是64位,那么size_t的正确定义应该是typedef unsigned long size_t。

ssize_t:

前一阵子,上Unix程序设计,问老师说ssize_t到底是什么数据类型,老师说,你直接用就好了,真要知道是什么数据类型,可以去types.h里去看一下,回去以后找了一下没有找到就放弃了,今天写代码又遇到这个问题,我觉得不是办法,还是得弄清除它到底是什么类型。当然了,对于ssize_t到底是什么数据类型,不知道问题也不大,但是对于控制欲强和好奇心重的人,总是想知道的,而且我相信,知道了总会有好处的,写代码的时候心里有底。
查找步骤:
    1. 包含头文件的时候是这么做的:#include <sys/types.h>,执行locate types.h跳出一堆文件,这也是为什么我第一次尝试失败的原因。首先执行locate sys/types.h,就可以找到types.h的存放位置了。
    2. 打开types.h,搜索 ssize_t,得到如下结果
#ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined
    3. 再搜索__ssize_t 就找不到任何有价值的信息了,观察文件发现,该文件还包含了其他头文件,也就是 #include <bits/types.h>,再次打开bits/types.h
    4. 搜索__ssize_t 找到了这么一条语句:__STD_TYPE __SSIZE_T_TYPE __ssize_t; 搜索__STD_TYPE_SSIZE 又找到了这样一句话:
/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef
也就是说,__STD_TYPE __SSIZE_T_TYPE __ssize_t;这条语句其实就是 typedef __SSIZE_T_TYPE __ssize_t,那么重点就是找到__SSIZE_T_TYPE了,搜索__SIZE_T_TYPE,又没有什么有价值的信息了,与步骤3类似,我们又找到了这条语句:#include <bits/typesizes.h>  ,打开typesizes.h文件,搜索__SSIZE_T_TYPE,很轻松的就找到了#define __SSIZE_T_TYPE          __SWORD_TYPE,也就是说最开始的 __STD_TYPE __SSIZE_T_TYPE __ssize_t; 这条语句其实就是 typedef __SWORD_TYPE  __ssize_t,typesize.h文件里找不到__SWORD_TYPE,于是我们又回到了bit/types.h中,结果终于出现了。
    5.在bit/types.h中很轻松的就找到了下面这几行语句。
#if __WORDSIZE == 32
# define __SQUAD_TYPE           __quad_t
# define __UQUAD_TYPE           __u_quad_t
# define __SWORD_TYPE           int
# define __UWORD_TYPE           unsigned int
# define __SLONG32_TYPE         long int
# define __ULONG32_TYPE         unsigned long int
# define __S64_TYPE             __quad_t
# define __U64_TYPE             __u_quad_t
/* We want __extension__ before typedef's that use nonstandard base types
   such as `long long' in C89 mode.  */
# define __STD_TYPE             __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE           long int
# define __UQUAD_TYPE           unsigned long int
# define __SWORD_TYPE           long int
# define __UWORD_TYPE           unsigned long int
# define __SLONG32_TYPE         int
# define __ULONG32_TYPE         unsigned int
# define __S64_TYPE             long int
# define __U64_TYPE             unsigned long int
/* No need to mark the typedef with __extension__.   */
# define __STD_TYPE             typedef
#else
# error
#endif
       我们几乎都可以猜到__WORDSIZE是什么意思了,它的定义在#include <bits/wordsize.h>中,表示计算机系统是几位的。从上面我们知道,在32位计算机系统中,ssize_t 是int型,占4个字节,在64位计算机系统中,ssize_t是long int 型,占8个字节。

size_t:

晕,size_t的资料居然找了半天。size_t大家都知道,是无符号整型,在/usr/include/i386-linux-gnu/sys/stddef.h下看到这么几条语句:
/* __size_t is a typedef on FreeBSD 5!, must not trash it. */
#else
#define __size_t
#endif
#ifndef __SIZE_TYPE__
#define __SIZE_TYPE__ long unsigned int
#endif
#if !(defined (__GNUG__) && defined (size_t))
typedef __SIZE_TYPE__ size_t;
#ifdef __BEOS__
typedef long ssize_t;
可以肯定的是,size_t是无符号整型,至于是long型,还是int型,可能不同的编译器有不同的定义,我这里没有64位的机器,无法验证。这也验证了我们上面所说的ssize_t其实就是一个long。
下面的是一点附加资料,证明我找到的是正确的。:-)
    一个基本的无符号整数的C / C + +类型。 它是sizeof操作符返回的结果类型。 该类型的大小是选择,因此,它可以存储在理论上是可能的任何类型的数组的最大大小。 在32位系统为size_t将采取32位和64位 - 64位。
参考资料:http://baike.baidu.com/view/3236587.htm
Data Type: ssize_t
        This data type is used to represent the sizes of blocks that can be read or written in a single operation. It is similar to size_t, but must be a signed type.

ssize_t和size_t详解相关推荐

  1. 15.linux-LCD层次分析(详解)

    如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口. 什么是frambuffer设备? frambu ...

  2. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  3. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  4. linux epoll事件模型详解

    一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...

  5. Socket详解——全面明了

    "一切皆Socket!"原文链接 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间 ...

  6. Cocos2d之Node类详解之节点树(二)

    一.声明 本文属于笔者原创,允许读者转载和分享,只要注明文章来源即可. 笔者使用cocos2d框架的cocos2d-x-3.3rc0版本的源代码做分析.这篇文章承接上篇<Cocos2d之Node ...

  7. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  8. linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)

    转发:Linux设备驱动并发控制详解(自旋锁,信号量) 作者:jinhaijun 提交日期:2008-3-12 14:08:00 | 分类: | 访问量:144 link:http://www.emb ...

  9. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...

  10. Linux Socket详解 大全 基础知识

    1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...

最新文章

  1. PHP的SQL注入攻击的技术实现以及预防措施
  2. Grinder搭建小记与Nduja(这次不待续了)
  3. P3916 图的遍历
  4. iframe和HTML5 blob实现JS,CSS,HTML直接当前页预览
  5. (转载)Shutter 0.90 发布 – BUG修复和增强
  6. 参数 中_Python中函数的参数传递
  7. Linux IPC实践(6) --System V消息队列(3)
  8. Java 8 Friday:语言设计很微妙
  9. Linux C 数据结构---链表(单向链表)
  10. cpu id 系列号代码
  11. (转)你真的会写单例模式吗——Java实现
  12. iOS buttonWithType:101 苹果私有api
  13. golang python扩展_Python: C扩展初体验
  14. Windows 10 上强制Visual Studio以管理员身份运行
  15. 解决微信公众平台图片不可引用
  16. c# 路径下的最近文件夹_C# 添加Word水印(文本水印、图片水印)
  17. 网站优化关键词排名不进不退该怎么办
  18. 2016年高校保送生拟录取名单 (北京大学)
  19. R语言和Python连接hive
  20. 地球坐标系与投影方式

热门文章

  1. java导入excel数据为树形处理
  2. 多媒体多模态系统:智能(记忆对话)小爱同学,nie li qiang
  3. 如何用C语言编辑一个万年历,如何用C语言编写一个万年历系统?
  4. Unity在运行时使用FBX SDK的API
  5. 王者荣耀交流协会-小组互评Alpha版本
  6. 常用 ASCII 码对照表
  7. wordcloud:自定义背景图片,生成词云
  8. 小心!新媒体环境下,营销传播还有几个大坑!
  9. Unity3D默认的快捷键
  10. 外汇风险管理:德鲁克日志之五月十一日