我最初的任务是安装 mod_perl 2.0.6 + Apache 2.2.22。该过程因编译 mod_perl 时
出现许多错误而停止。off64_t
于是,我开始深入挖掘。首先,我安装了两个新的 Perl 5.8.9 实例(因为我必须使用这个版本):一个线程版本和一个非线程版本(它们是相同的,只是usethreads
不同)。尝试使用线程化的 Perl 重现相同的内容并成功完成并且完全没有off64_t
错误。
结论很明显:线程化的 Perl 提供了必要off64_t
的,非线程化的则没有。
进一步搜索,我比较了两个 Perl 的config.h
(来自core/<arch>/CORE
),在第 3671 行我可以看到这个(在非线程 Perl 中):
/* HAS_OFF64_T:
* This symbol will be defined if the C compiler supports off64_t.
*/
/*#define HAS_OFF64_T / **/
在启用线程的 Perl 中:
#define HAS_OFF64_T /**/
perl -V
对于两个 Perl 实例都报告ccflags ='... -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ...'
为使用的编译器标志。
据我了解,off64_t
用于大文件,与线程无关。我找到了关于off_t
和的信息off64_t
:
如果源是用
_FILE_OFFSET_BITS = 64
这种类型编译的(即off_t
)透明地被替换为off64_t
.
很快:有 2 个相同的 Perl 构建,只有一个区别:usethreads
配置参数。带线程的 Perl 启用off64_t
,非线程的则不启用。
我的问题是:为什么会发生这种情况以及线程如何连接到off64_t
应该用于大文件而不是线程的这种数据类型?
信息:Arch Linux OS 32 位(内核 2.6.33)、gcc 4.5.0、libc 2.11.1、标准 Perl 5.8.9
注:在第 15526 行off64_t
处理,生成一个简单的并尝试编译。问题是为什么非线程 Perl 不能编译它而线程 Perl 可以。Configure
try.c