LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 9822|回复: 8

off_t 究竟是什么类型?

[复制链接]
发表于 2005-3-6 01:07:05 | 显示全部楼层 |阅读模式
我使用如下的代码测试的时候:

  1. #include <stdio.h>
  2. #include <sys/types.h>

  3. int
  4. main()
  5. {
  6.     off_t a = 4096;
  7.     off_t b = 1024;
  8.     off_t c = 2048;
  9.     off_t d = 9192;
  10.    printf("sizeof(off_t) = %d, sizeof(long int)= %d\n",
  11.            sizeof(off_t), sizeof(long int));
  12.    printf(" a = %ld\n", a);
  13.    printf(" b = %ld\n", b);
  14.    printf(" c = %ld\n", c);
  15.    printf(" d = %ld\n", d);
  16.    
  17.     return 0;
  18. }
复制代码

输出没一点问题:
sizeof(off_t) = 4, sizeof(long int)= 4
a = 4096
b = 1024
c = 2048
d = 9192

但是我在调试编译xine的时候,在io_help.c中我插入一句:
printf("sizeof(todo) = %d, total = %lld, todo = %lld\n", sizeof(todo), total, todo);
输出的却是
sizeof(todo) = 8, total = 0, todo = 17592186044544
明显的不对
因为todo 应该为128
发表于 2005-3-6 08:20:16 | 显示全部楼层
linux系统上off_t的类型就是long
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-6 19:13:10 | 显示全部楼层
Post by kj501
linux系统上off_t的类型就是long

我起初也是这么想的,可是发现这个sizeof(todo) = 8没法解释呀
还有,我如果把%lld改成%ld的话,编译器也会出现警告,说类型不对
回复 支持 反对

使用道具 举报

发表于 2005-3-6 21:58:10 | 显示全部楼层
todo是个什么类型?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-7 00:57:26 | 显示全部楼层
Post by kj501
todo是个什么类型?

就是off_t呀
回复 支持 反对

使用道具 举报

发表于 2005-3-7 11:00:35 | 显示全部楼层
既然是off_t ,应该就是4个字节,怎么会有8个字节?
你编译时加上-g,然后在gdb中用ptype off_t看看到底是编译成什么类型。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-7 19:43:19 | 显示全部楼层
Post by kj501
既然是off_t ,应该就是4个字节,怎么会有8个字节?
你编译时加上-g,然后在gdb中用ptype off_t看看到底是编译成什么类型。

是被编译成了long long int
经过查看发现问题的出在:
#define __FILE_OFFSET_BITS 64
configure 的时候,定义了这个。
现在的问题是
在32位linux上,__FILE_OFFSET_BITS 究竟应该是多少,是32,还是64?
回复 支持 反对

使用道具 举报

发表于 2005-3-7 22:48:22 | 显示全部楼层
应该是64的。你自己可以搜索一下/usr/include中的头文件看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-7 23:37:51 | 显示全部楼层
Post by kj501
应该是64的。你自己可以搜索一下/usr/include中的头文件看看。

如果是这样的话,就不大对了

  1. /* /usr/include/unistd.h */
  2. #ifndef        _UNISTD_H
  3. #define        _UNISTD_H        1

  4. #include <features.h>
  5. # ifndef __off_t_defined
  6. #  ifndef __USE_FILE_OFFSET64
  7. typedef __off_t off_t;
  8. #  else
  9. typedef __off64_t off_t;
  10. #  endif
  11. #  define __off_t_defined

  12. #endif
复制代码


  1. /* /usr/include/feather.h */
  2. #if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
  3. # define __USE_FILE_OFFSET64        1
  4. #endif
复制代码

  1. /* /usr/include/bits/types.h */
  2. #include <bits/typesizes.h>        /* Defines __*_T_TYPE macros.  */

  3. /* We want __extension__ before typedef's that use nonstandard base types
  4.    such as `long long' in C89 mode.  */
  5. #define __STD_TYPE __extension__ typedef
  6. __STD_TYPE __OFF64_T_TYPE __off64_t;        /* Type of file sizes and offsets (LFS).  */
复制代码

  1. /* /usr/include/bits/typesizes.h */
  2. #define __OFF64_T_TYPE                __SQUAD_TYPE
复制代码

  1. /* /usr/include/bits/bytes.h */
  2. # define __SQUAD_TYPE                long long int
复制代码


从这些文件可以看出,如果定义了FILE_OFFSET_BITS 为64的话,off_t就是 long long int 而不是long int
所以在32位的linux上面应该是FILE_OFFSET_BITS应该为32(??是不是根据不同的需要是可以有不同的定义?)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表