GoGPT Best VPN GoSearch

OnWorks 网站图标

perlos2 - 在云端联机

在 OnWorks 免费托管服务提供商中通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器运行 perlos2

这是命令 perlos2,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


perlos2 - OS/2、DOS、Win0.3*、Win0.95 和 WinNT 下的 Perl。

概要


可以按以下格式阅读本文档:

男人 perlos2
查看 perl perlos2
资源管理器 perlos2.html
信息 perlos2

列出一些(并非所有可能同时可用),或者可以阅读 as is:作为
自述文件.os2吊舱/ perlos2.pod.

阅读 .INF文件 文档版本(非常 推荐)在 OS/2 之外,需要一个
IBM 的阅读器(可在 IBM ftp 站点 (?)(URL 任何人?)上提供)或随 PC DOS 一起提供
7.0 和 IBM 的 Visual Age C++ 3.5。

Win* 查看器的副本包含在“Just add OS/2 Warp”包中

ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip

in ?:\JUST_ADD\view.exe. 这使人们可以访问 EMX .INF文件 文档也是如此(文本形式是
可用 /emx/文档 在 EMX 的发行版中)。 还有一个名为的不同查看器
视图。

请注意,如果您有 猞猁程序 or 网景软件 已安装,您可以从以下网址访问 WWW 链接
这份文件在 .INF文件 格式。 如果您正确安装了 EMX 文档,您可以按照
库链接(您需要通过设置“EMXBOOK”环境来让“查看 emxbook”工作
EMX 文档中描述的变量)。

商品描述


目标
目标是使 OS/2 成为最受支持的平台之一
使用/构建/开发 Perl 和 Perl的 应用,以及让 Perl 成为最好的
在 OS/2 下使用的语言。 次要目标是尝试在 DOS 和
也赢*(但不是 也有 难的)。

目前的状态非常接近这个目标。 已知限制:

· 一些*nix 程序使用 叉子() 很多; 具有用于 OS/2 的最有用的 perl 风格
(有几个同时构建)这是支持的; 但有些口味没有
支持这一点(例如,当从 REXX 内部调用 Perl 时)。 使用 叉子() after 使用博士开发的技术萃取的
动态加载扩展将无法使用 非常 旧版本的 EMX。

· 你需要一个单独的 perl 可执行文件 perl的__。可执行程序 (参见“perl__.exe”)如果你想使用
应用程序中的 PM 代码(如 Perl/Tk 或 OpenGL Perl 模块所做的那样),而无需
存在文本模式窗口。

使用标准时 perl.exe所在 从文本模式窗口也是可能的,我有
这会导致系统稳定性下降的情况。 使用 perl的__。可执行程序
避免了这种退化。

· 没有访问 WPS 对象的简单方法。 我知道的唯一方法是通过“OS2::REXX”
和“SOM”扩展(见 OS2::REXX, SOM)。 但是,我们无法访问
Object-REXX 的便捷方法。 (这可能吗?我知道没有 Object-REXX
API。)“SOM”扩展(目前在 alpha 文本中)可能最终会删除这个
缺点; 然而,由于“SOM”模块不支持 DII,
使用“SOM”并不像人们希望的那样方便。

请告知我有关其他项目的信息,使此列表保持最新状态。

其他 操作系统
由于 perl 的 OS/2 端口使用了卓越的 EMX 环境,因此它可以运行(和构建
扩展,并且 - 可能 - 自己构建)在可以运行 EMX 的任何环境下。 这
当前列表是 DOS、DOS-inside-OS/2、Win0.3*、Win0.95 和 WinNT。 在许多 perl 中
口味,只有一种有效,请参阅“perl_.exe”。

请注意,并非 Perl 的所有功能都在这些环境下可用。 这取决于
特点 扩展 - 很可能是 RSX - 决定实施。

参见“先决条件”。

硬件需求
EMX 需要 EMX 运行时(可以用 RSX 代替)。 请注意,可以
使 perl_.exe 通过绑定在没有任何外部支持的情况下在 DOS 下运行
exe程序/rsx.exe 对此,请参见“emxbind”。 请注意,在 DOS 下获得最佳结果一
应该使用 RSX 运行时,它具有更多的功能(如“fork”、“popen”
等等)。 实际上,如果不存在 VCPI,则需要 RSX。 注意 RSX
需要 DPMI。 众所周知,DPMI 的许多实现都非常有缺陷,请注意!

仅支持最新的运行时,当前为“0.9d fix 03”。 Perl 可能运行在
早期版本的 EMX,但这没有经过测试。

可以从 EMX 的不同部分获得,例如

ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+海湾合作委员会/
http://hobbes.nmsu.edu/h-browse.php?dir=/pub/os2/dev/emx/v0.9d/

运行时组件应具有名称 emxrt.zip.

注意。 使用时 exe程序/rsx.exe,让他们走上你的道路就足够了。 一个做
不需要明确指定它们(尽管这

emx perl_.exe -de 0

也会起作用。)

RSX 要在 DPMI 平台上运行 Perl,需要 RSX 运行时。 这是下需要的
DOS-inside-OS/2、Win0.3*、Win0.95 和 WinNT(参见“其他操作系统”)。 RSX 不起作用
仅使用 VCPI,就像 EMX 一样,它需要 DMPI。

拥有 RSX 和最新的 sh.exe 一个功能齐全的 * nix中-ish环境
在 DOS 下,比如说,"fork"、"``" 和 pipe-"open" 工作。 事实上,MakeMaker 是有效的(对于
静态构建),这样就可以在 DOS 下拥有 Perl 开发环境。

可以从以下位置获取 RSX,例如

http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/
ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/emx+gcc/贡献/

联系作者“[email protected]".

最新的 sh.exe 与 DOS 挂钩可在

http://www.ilyaz.org/software/os2/

as sh_dos.zip 或以“sh”、“pdksh”等开头的类似名称。

HPFS Perl 不关心文件系统,但 perl 库包含许多文件
长名称,因此要完整安装它需要一个支持长文件的文件系统
名称。

请注意,如果您不打算构建 perl 本身,则可能会被愚弄
EMX 截断文件名。 这不受支持,请阅读 EMX 文档以了解如何操作
它。

pdksh 用复杂的命令行启动外部程序(比如用管道输入
之间和/或引用参数),Perl 使用外部 shell。 带 EMX 端口
这样的外壳应该被命名 sh.exe, 并且位于编译期间的连线中
地点(通常 F:/箱),或在可配置的位置(请参阅“PERL_SH_DIR”)。

为获得最佳结果,请使用 EMX pdksh。 标准二进制文件(5.2.14 或更高版本)在 DOS 下运行
(与“RSX”)以及,见

http://www.ilyaz.org/software/os2/

开始 Perl的 程式 OS / 2 (和 DOS 和...)
启动你的 Perl 程序 文件名 使用参数“arg1 arg2 arg3”的方式与任何
其他平台,由

perl foo.pl arg1 arg2 arg3

如果你想为 perl 本身指定 perl 选项“-my_opts”(而不是你的
程序),使用

perl -my_opts foo.pl arg1 arg2 arg3

或者,如果您使用 OS/2-ish shell,如 CMD 或 4os2,请将以下内容放在开头
你的 perl 脚本:

extproc perl -S -my_opts

将您的程序重命名为 foo.cmd,然后键入

富 arg1 arg2 arg3

请注意,由于愚蠢的 OS/2 限制,perl 脚本的完整路径不是
当您使用“extproc”时可用,因此您被迫使用“-S” perl 开关,并且您的
脚本应该在“PATH”上。 好的一面是,如果您知道脚本的完整路径,
你仍然可以用

perl ../../blah/foo.cmd arg1 arg2 arg3

(请注意,参数“-my_opts”由脚本中的“extproc”行处理,
请参阅第一行的“”extproc”)。

了解以上内容 魔法 确实,请阅读有关“-S”开关的 perl 文档 - 请参阅 perlrun,
和 cmdref 关于“extproc”:

查看 perl perlrun
男人 perlrun
查看 cmdref extproc
帮助 extproc

或任何你喜欢的方法。

还有无限可能使用 可执行 扩展 4os2, 协会 of
WPS 等等...但是,如果您使用 *nixish shell(例如 sh.exe 以二进制形式提供
发行版),您需要遵循 perlrun 中“命令开关”中指定的语法。

需要注意的是 -S switch 支持带有附加扩展的脚本 .CMD, .btm的, 。BAT, 特等 as
井。

开始 OS / 2 (和 背部) 程式 Perl的
这是什么 系统() (参见 perlfunc 中的“system”),“``”(参见 perlop 中的“I/O 操作符”),
open (参见 perlfunc 中的“打开”)是为了。 (避免 exec() (参见 perlfunc 中的“exec”)
除非你知道你在做什么)。

但是请注意,要使用其中一些运算符,您需要有一个 sh-syntax shell
已安装(请参阅“Pdksh”、“常见问题”),并且 perl 应该能够找到它
(见“PERL_SH_DIR”)。

使用shell的情况有:

1. 一论 系统() (参见 perlfunc 中的“系统”), exec() (参见 perlfunc 中的“exec”)与
重定向或 shell 元字符;

2. 使用包含重定向或
shell 元字符;

3. 反引号“``”(参见 perlop 中的“I/O 操作符”)包含的命令
重定向或 shell 元字符;

4. 如果可执行文件被调用 系统()/exec()/管道-打开()/"``" 是一个带有
“魔法” ”#!” 指定 shell 的行或“extproc”行;

5. 如果可执行文件被调用 系统()/exec()/管道-打开()/"``" 是一个没有脚本
"magic" 行,并且 $ENV{EXECSHELL} 设置为 shell;

6. 如果可执行文件被调用 系统()/exec()/管道-打开()/"``" 没有找到(不是这个
评论过时了?);

7. 对于 globbing(参见 perlfunc 中的“glob”,perlop 中的“I/O Operators”)(过时?Perl 使用
现在内置通配符......)。

出于对常见情况的速度考虑,在上述算法中,在
命令名称不被视为 shell 元字符。

Perl 启动以cookie“extproc”或“#!”开头的脚本直接,无需
壳的干预。 Perl 使用相同的算法来查找可执行文件 PDKSH:如果
“#!”上的路径行不起作用,并且包含“/”,那么目录部分
可执行文件被忽略,并且可执行文件在 . 并在“路径”上。 寻找
这些脚本的参数 Perl 使用的算法与 PDKSH: 最多 3 个参数
被识别,并去除尾随空格。

如果脚本不包含此类 cookie,则避免调用 sh.exe, Perl 使用
相同的算法 PDKSH: 如果设置了 $ENV{EXECSHELL},则脚本作为第一个给出
此命令的参数,如果未设置,则使用“$ENV{COMSPEC} /c”(或硬连线
猜测是否未设置 $ENV{COMSPEC})。

当直接启动脚本时,Perl 使用与搜索完全相同的算法
给出的脚本 -S 命令行选项:它将在当前目录中查找,然后打开
$ENV{PATH} 的组件使用以下附加扩展的顺序:无扩展,
.CMD, .btm的, 。BAT, 特等.

请注意,仅当 OS/2 无法启动指定的脚本时,Perl 才会开始寻找脚本。
应用程序,因此如果有可执行文件,“系统 'blah'” 将不会查找脚本
文件 等等.exe 分析数据 在“路径”上。 换句话说,“PATH”本质上被搜索了两次:
一次由操作系统用于可执行文件,然后由 Perl 用于脚本。

另请注意,OS/2 上的可执行文件可以具有任意扩展名,但 。可执行程序
如果名称中没有点,则自动附加。 解决方法很简单
那:因为 等等。胡说 表示相同的文件(在 FAT 和 HPFS 文件系统的列表中),
启动驻留在文件中的可执行文件 n:/斌/等等 (无扩展名)给出一个论点
“n:/bin/等等。” (点附加)到 系统().

Perl 将在单独的 PM 会话中从 VIO (=text-mode) Perl 进程启动 PM 程序;
反之则不然:当您从 PM Perl 进程启动非 PM 程序时,Perl
不会在单独的会话中运行它。 如果需要单独的会话,请确保
将使用该外壳,如“system 'cmd /c myprog'”,或使用可选启动它
参数 系统() 记录在“OS2::Process”模块中。 这被认为是一个
功能。

频繁 问题


“它 而不去 工作”
Perl 二进制发行版带有 测试perl.cmd 试图检测常见的脚本
错误配置的安装问题。 很有可能会
发现您设法搞砸了安装的哪一步。 “;-)”

I 不能 运行 外部 程式
· 你用“-w”开关运行你的程序了吗? 请参阅“启动 OS/2(和 DOS)程序
在 Perl 下”。

·你尝试跑步吗 内部 shell 命令,例如“`copy ab`”(内部用于 CMD.EXE),
或“`glob a*b`”(ksh 内部)? 您需要明确指定您的外壳,例如
"`cmd /c copy ab`",因为 Perl 无法推断哪些命令是你的内部命令
贝壳。

I 不能 perl的 my 程序 or 使用 文件 my 程序。
您的程序是否使用“-Zmt -Zcrtdll”进行 EMX 编译?
好吧,现在 Perl DLL 也应该可以从不同编译的程序中使用......
如果您可以从 REXX 脚本运行 Perl 代码(请参阅 OS2::REXX),那么还有其他一些
当前hackish代码忽略的交互方面以支持
不同编译的主程序。

如果其他一切都失败了,您需要为 perl 构建一个独立的 DLL。 联系我,我
做过一次。 套接字不起作用,就像很多其他东西一样。

你使用了 ExtUtils::Embed 吗?
前段时间我有报告它不起作用。 现在它在 Perl 测试中被检查
套件,所以 grep ./吨 构建树的子目录(以及 *.t 中的文件 ./ lib目录
子目录)找到它应该如何“正确”完成。

“``” 管道-“打开” do 而不去 工作 二。
这可能只是“我无法运行外部程序”的变体,或者更深层次的问题。
基本上:你 需要 RSX(请参阅“先决条件”)使这些命令起作用,您可能需要
的港口 sh.exe 它理解命令参数。 其中一个这样的端口列在
RSX 下的“先决条件”。 不要忘记设置变量“PERL_SH_DIR”。

RSX 需要 DPMI。

不能 开始 “查找.exe “图案” 文件”
“启动应用程序的标准 C API”的整个想法是形式“foo”和
程序参数的“foo”是完全可以互换的。 发现 打破这种范式;

找到“模式”文件
查找模式文件

不等价; 发现 不能直接使用上述API启动。 一个人需要一种方式
在其他一些引用结构中将双引号括起来,必须有一个
中间有额外的非 Unixish shell。

使用其中之一

system 'cmd', '/c', '找到“模式”文件';
`cmd /c '找到“模式”文件'`

这将开始 查找文件 通过 CMD.EXE 通过“sh.exe”通过“perl.exe”,但这是一个代价
如果您想使用不合格的程序,请付费。

安装


自动表 二进制 安装
安装 perl 二进制分发版最方便的方法是通过 perl 安装程序
INSTALL.EXE. 只需按照说明操作,99% 的安装蓝调就会消失
远。

但是请注意,您需要拥有 包含unzip.exe 在您的道路上,以及 EMX 环境 运行.
后者意味着,如果您刚刚安装了 EMX,并进行了所有需要的更改
配置文件,您可能需要在两者之间重新启动。 通过运行检查 EMX 运行时

埃克斯雷夫

二进制安装程序还会在您的桌面上创建一个文件夹,其中包含一些有用的对象。 如果你
需要更改二进制安装程序工作的某些方面,请随意编辑
文件 Perl软件包. 这可能很有用,例如,如果您需要多次运行安装程序并且
不想在 GUI 中进行许多交互式更改。

事情 而不去 拍摄 关心 of by 自动 二进制 安装:

如果您更改代码页,则可能需要“PERL_BADLANG” after perl 安装,以及
EMX 不支持新值。 参见“PERL_BADLANG”。

“PERL_BADFREE”参见“PERL_BADFREE”。

配置文件 此文件位于您安装 perl 的位置深处的某个位置
图书馆,找到它

perl -MConfig -le "print $INC{'Config.pm'}"

虽然此文件中最重要的值 旨在 由二进制更新
安装程序,其中一些可能需要手动编辑。 我不知道这样的数据,
如果你找到了,请通知我。 此外,手动更改
安装的版本可能需要伴随着对这个文件的编辑。

注意. 由于打字错误,5.00305 的二进制安装程序会安装一个变量
“PERL_SHPATH”进入 配置文件. 请删除此变量并使用“PERL_SH_DIR”代替。

用户手册 二进制 安装
从 5.00305 版本开始,OS/2 perl 二进制分发版分为 11 个组件。
不幸的是,要启用可配置的二进制安装,zip 文件中的文件路径
不是绝对的,而是相对于某个目录。

请注意,仍然需要使用存储的路径进行提取(默认为 unzip,
为 pkunzip 指定“-d”)。 但是,您需要知道在哪里提取文件。 你需要
也可以手动更改条目 配置文件 以反映您将文件放在哪里。 笔记
如果你有一些原始的解压器(比如“pkunzip”),你可能会得到很多
解压缩期间的警告/错误。 升级到“(w)unzip”。

下面是如何在我的机器上重现配置的示例。 在
查看程序 您现在可以按“Ctrl-Insert”,然后从生成的文件中剪切和粘贴 -
在您启动的目录中创建 查看程序 从。

对于每个组件,我们提到了与每个安装相关的环境变量
目录。 选择目录以匹配您的变量值,或者
创建/附加到变量以考虑目录。

Perl VIO 和 PM 可执行文件(动态链接)
解压 perl_exc.zip *.exe *.ico -df:/emx.add/bin
解压 perl_exc.zip *.dll -df:/emx.add/dll

(在 PATH 上有带有“*.exe”的目录,在 LIBPATH 上有带有“*.dll”的目录);

Perl_ VIO 可执行文件(静态链接)
解压 perl_aou.zip -df:/emx.add/bin

(在 PATH 上有目录);

Perl 实用程序的可执行文件
解压 perl_utl.zip -df:/emx.add/bin

(在 PATH 上有目录);

主要 Perl 库
解压 perl_mlb.zip -df:/perllib/lib

如果这个目录和编译成的前缀完全一样 perl.exe所在,
你不需要改变任何东西。 但是,如果您使用
不同的路径,你需要“设置 PERLLIB_PREFIX” 配置文件,见“PERLLIB_PREFIX”。

额外的 Perl 模块
解压 perl_ste.zip -df:/perllib/lib/site_perl/5.22.1/

与上述相同的备注适用。 此外,如果此目录不是以下目录之一
@INC 上的目录(并且 @INC 受“PERLLIB_PREFIX”的影响),你需要把这个
目录和子目录 ./os2 在“PERLLIB”或“PERL5LIB”变量中。 不使用
“PERL5LIB”,除非您已经设置了它。 请参阅 perl 中的“环境”。

[查看 是否 Free Introduction 提取 目录 is 仍然 相应 - 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 目录
结构体 布局!]

编译 Perl 模块的工具
解压 perl_blb.zip -df:/perllib/lib

相同的评论 perl_ste.zip.

Perl 和实用程序的联机帮助页
解压 perl_man.zip -df:/perllib/man

这个目录最好在“MANPATH”上。 你需要有一个工作 男子 访问
这些文件。

Perl 模块的联机帮助页
解压 perl_mam.zip -df:/perllib/man

这个目录最好在“MANPATH”上。 你需要有一个工人才能访问
这些文件。

Perl 文档来源
解压 perl_pod.zip -df:/perllib/lib

这由“perldoc”程序使用(请参阅 perldoc),并可用于生成 HTML
WWW 浏览器可用的文档,以及无数其他格式的文档:
“信息”、“LaTeX”、“Acrobat”、“FrameMaker”等。 [使用程序,如 pod2乳胶
等等。]

Perl 手册中 .INF文件 格式
解压 perl_inf.zip -dd:/os2/book

这个目录最好在“BOOKSHELF”上。

pdksh
解压 perl_sh.zip -df:/箱

perl 使用它来运行明确需要 shell 的外部命令,例如
命令使用 重定向 元字符. 它也被用来代替
明确的 / bin / sh的.

如果移动,请设置“PERL_SH_DIR”(参见“PERL_SH_DIR”) sh.exe 从上述位置。

注意事项。 可以使用其他一些与 sh 兼容的 shell(未经测试)。

安装所需的组件并更新后 配置文件 相应地,
你需要手动编辑 配置文件. 此文件位于您所在位置的深处
安装了你的 perl 库,通过

perl -MConfig -le "print $INC{'Config.pm'}"

您需要更正所有看起来像文件路径的条目(它们当前以
“F:/”)。

警告
自动和手动 perl 安装在 perl 中保留预编译路径
可执行文件。 虽然这些路径是可覆盖的(请参阅“PERLLIB_PREFIX”、“PERL_SH_DIR”),
有些人可能更喜欢对可执行文件/DLL 中的路径进行二进制编辑。

访问 文件


根据您构建/安装 perl 的方式,您可能拥有(否则相同)Perl
以下格式的文档:

OS / 2 .INF文件 文件
很可能是最方便的形式。 在 OS/2 下将其视为

查看 perl
查看 perl perlfunc
少看 perl
查看 perl ExtUtils::MakeMaker

(目前最后两个可能打错了位置,但这可能很快会改善)。 赢下*
见“概要”。

如果你想自己构建文档,并且有 OS / 2 工具箱, 跑

pod2ipf > perl.ipf

in /perllib/库/吊舱 目录,然后

ipfc /inf perl.ipf

(预计在这两个步骤中都会出现很多错误。)现在将它移动到您的 BOOKSHELF 路径上。

朴素 文本
如果您有源代码形式的 perl 文档、安装了 perl 实用程序和 GNU groff
已安装,您可以使用

perldoc 性能函数
少 perldoc
perldoc ExtUtils::MakeMaker

以文本形式访问 perl 文档(注意,您可能会得到更好的结果
使用 perl 联机帮助页)。

或者,尝试运行 pod2text 。荚 文件。

联机帮助页
如果你有 男子 安装在您的系统上,并且您安装了 perl 联机帮助页,请使用一些东西
喜欢这个:

男人 perlfunc
少3人
男人 ExtUtils.MakeMaker

访问 Perl 不同组件的文档。 从...开始

人 perl

请注意,点 (.) 用作包文档的包分隔符,并作为
通常,有时您需要给出第 3 部分 - 以避免被
(1) 联机帮助页.

确保目录 以上 带有联机帮助页的目录在我们的“MANPATH”上,例如
Free Introduction

设置 MANPATH=c:/man;f:/perllib/man

对于 "f:/perllib/man/man1/" 等中的 Perl 联机帮助页。

HTML
如果您有可用的 WWW 浏览器,请在源代码中安装 Perl 文档
表单和 Perl 实用程序,您可以构建 HTML 文档。 cd到目录 。荚 文件,然后做
喜欢这个

cd f:/perllib/lib/pod
pod2html

在此之后,您可以将文件定向到浏览器 perl.html 在这个目录中,然后继续
阅读文档,像这样:

探索 file:///f:/perllib/lib/pod/perl.html

或者,您可以从 CPAN 获得这些预先构建的文档。

GNU “信息”
Emacs 的用户会非常喜欢它,尤其是在加载了“CPerl”模式的情况下。 你
需要从“CPAN”或预构建的信息页面获取最新的“pod2texi”。

PDF
“Acrobat”可在 CPAN 上使用(可能适用于稍旧版本的 perl)。

“乳胶” 文档
可以使用“pod2latex”构建。

建造公园


这里我们讨论如何在 OS/2 下构建 Perl。

这个 故事
假设您是一名经验丰富的搬运工,因此请确保所有必要的工具都已准备就绪
已经存在于您的系统中,并且您知道如何获取 Perl 源代码分发版。
解压它,切换到解压目录,然后

gnupatch -p0 < os2\diff.configure
sh 配置 -des -D prefix=f:/perllib
使
做测试
使安装
进行 aout_test
制作 aout_install

这会将可执行文件放在 f:/perllib/bin 中。 手动将它们移动到“PATH”,手动
移动已建 perl*.dll 到“LIBPATH”(这里是 Perl DLL * 是一个不太有意义的十六进制
校验和),然后运行

make installcmd INSTALLCMDDIR=d:/ir/on/路径

假设“人”文件被放置在适当的位置,这就完成了
安装最小的 Perl 系统。 (二进制发行版也包含很多
附加模块,以及 INF 格式的文档。)

下面是这些步骤的详细指南。

硬件需求
你需要有最新的 EMX 开发环境,完整的 GNU 工具套件 (gawk
重命名为 awk,和 GNU 查找文件 比 OS/2 更早的路径 查找文件,与
排序工具, 检查使用

查找 --version
排序 --version

)。 您需要最新版本的 PDKSH 安装为 sh.exe.

检查你有 BSD 已安装库和头文件,以及 - 可选 - Berkeley DB
头文件和库,以及 crypt。

获取文件的可能位置:

ftp://ftp.uni-heidelberg.de/pub/os2/unix/
http://hobbes.nmsu.edu/h-browse.php?dir=/pub/os2
http://cd.textfiles.com/hobbesos29804/disk1/DEV32/
http://cd.textfiles.com/hobbesos29804/disk1/EMX09C/

据报道,以下档案包含足够的 utils 来构建 perl:
gnufutil.zip, gnusutil.zip, gnututil.zip, gnus.zip, 补丁.zip, gnuawk.zip,
gnumake.zip, gnugrep.zip, bsddev.zipksh527rt.zip (或更高版本)。 请注意,所有
已知这些实用程序可从 LEO 获得:

ftp://crydee.sai.msu.ru/pub/comp/os/os2/leo/gnu/

还要注意的是 数据库数据库 从 EMX 分布不适合多
线程编译(即使是单线程风格的 Perl 也使用多线程 C RTL,对于
与 XFree86-OS/2 兼容)。 从

http://www.ilyaz.org/software/os2/db_mt.zip

如果你有 究竟 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 版本 of Perl的 已经安装,确保没有副本
或 perl 当前正在运行。 由于旧版本,构建的后续步骤可能会失败
of 文件 加载到内存中可能会被发现。 运行“make test”变得毫无意义,
由于测试正在检查以前的 perl 版本(检测到这种情况并且
所报告的 库/os2_base.t 测试)。 不要忘记取消设置“PERL_EMXLOAD_SEC”
环境。

还要确保你有 / tmp目录 当前驱动器上的目录,以及 . 你的目录
“库路径”。 可以尝试通过以下方式纠正后一种情况

设置 BEGINLIBPATH .\.

如果你使用类似的东西 命令文件 或最新版本 4os2.exe. (设置 BEGINLIBPATH
只是“。” 被 OS/2 内核忽略。)

确保您的 gcc 适用于“-Zomf”链接:在其中运行“omflibs”脚本 /emx/库
目录。

检查您是否安装了 link386。 它是 OS/2 的标准配置,但可能不是
由于定制而安装。 如果打字

link386

表明你没有它,做 可选择的 安装,然后选择“链接对象模块”
可选 系统 公用事业/更多. 如果您进入 link386 提示,请按“Ctrl-C”退出。

得到 perl的 资源
您需要获取最新的 perl 源代码(包括开发人员版本)。 和一些
它位于的概率

http://www.cpan.org/src/
http://www.cpan.org/src/unsupported

如果没有,您可能需要在索引中挖掘以在当前目录中找到它
维护者。

开发人员发布的快速周期可能会不时破坏 OS/2 构建,调查

http://www.cpan.org/ports/os2/

可能表示维护者公开发布的最新版本。 注意
该版本可能包括一些额外的补丁,以应用于当前的 perl 源。

像这样提取它

tar vzxf perl5.00409.tar.gz

提取时您可能会看到有关错误的消息 配置. 这是因为有一个
与同名文件冲突 配置.

切换到解压目录。

实践应用 of 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 补丁
你需要应用补丁 ./os2/差异* 喜欢这个:

gnupatch -p0 < os2\diff.configure

您可能还需要应用随 perl 二进制分发版提供的补丁。 它
查看 perl5-porters 邮件列表以获取最新的 OS/2 相关信息也很有意义
补丁(见http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/>)。 这样的补丁
通常包含字符串“/os2/”和“patch”,因此查找这些字符串是有意义的。

手工编辑
你可以查看文件 ./提示/os2.sh 并纠正你在那里发现的任何错误。 我做
没想到任何地方都需要它。

制作
sh 配置 -des -D prefix=f:/perllib

“前缀”的意思是:在哪里安装生成的 perl 库。 给出正确的前缀,你可以
避免需要指定“PERLLIB_PREFIX”,参见“PERLLIB_PREFIX”。

忽略 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 消息 关于 失踪 "ln", 关于 “-C” 选项 tr. 后者是最
可能已经修复,如果你看到它并且可以追踪后一个虚假警告的位置
来自哪里,请告知。

现在

使

在某个时刻,构建的可能会死亡,报告一个 版本 不匹配 or 无法 运行 perl的.
这意味着你没有 . 在你的 LIBPATH 中,所以 perl.exe所在 找不到需要的
perl67B2.dll (将这些十六进制数字视为线路噪声)。 修复此问题后,构建应该
完成没有大惊小怪。

测试与验证
现在运行

做测试

所有测试都应该成功(其中一些被跳过)。 如果你有相同版本的
安装了 Perl,关键是你有“.” 在 LIBPATH 的早期(或在
BEGINLIBPATH),否则您的测试很可能会测试错误的 Perl 版本。

某些测试可能会生成类似于以下内容的额外消息

很多“坏免费”
在与 Berkeley DB 相关的数据库测试中。 本篇 应该 be 固定 已。 如果它
仍然存在,您可以禁用此警告,请参阅“PERL_BADFREE”。

进程被 SIGTERM/SIGINT 终止
这是由 OS/2 应用程序发出的标准消息。 *nix 应用程序消亡
安静。 它被认为是一个特征。 可以通过适当的方式轻松禁用此功能
叹息者。

然而,测试引擎会在意想不到的时刻将这些消息流血到屏幕上。 二
此类消息 应该 在测试期间出现。

要获得更精细的测试报告,请致电

perl t/线束

该报告与 io/pipe.t 失败可能如下所示:

失败的测试状态 Wstat 总失败 失败 失败列表
-------------------------------------------------- ----------
io/pipe.t 12 1 8.33% 9
跳过了 7 个测试,另外还跳过了 56 个子测试。
1/195 测试脚本失败,99.49% 正常。 1/6542 个子测试失败,99.98% 正常。

最重要的跳过测试的原因是:

操作/fs.t
18 检查“stat()”的“atime”和“mtime”——不幸的是,HPFS 只提供
2 秒时间粒度(为了与 FAT 兼容?)。

25 检查刚刚打开用于写入的文件句柄上的“truncate()” - 我不知道为什么
这应该或不应该工作。

操作/统计.t
检查“stat()”。 测试:

4 检查“stat()”的“atime”和“mtime”——不幸的是,HPFS 只提供
2 秒时间粒度(为了与 FAT 兼容?)。

安装 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 perl的
如果您还没有将“perl*.dll”移动到 LIBPATH,现在就去做。

运行

使安装

它会将生成的文件放入所需的位置。 手动放置 perl.exe所在, perl的__。可执行程序
perl的___。可执行程序 到您 PATH 上的某个位置, 文件 到 LIBPATH 上的某个位置。

运行

make installcmd INSTALLCMDDIR=d:/ir/on/路径

将 perl 实用程序转换为 .CMD 文件并将它们放在 PATH 上。 你需要把
。EXE- 手动路径上的实用程序。 它们安装在“$prefix/bin”中,这里 $prefix 是什么
你给 配置,见“制作”。

如果您使用“man”,请移动已安装的 */男子/ 目录到您的“MANPATH”,或
修改“MANPATH”以匹配位置。 (可以通过提供一个
正确的“manpath”选项 /配置, 或编辑 ./config.sh 在配置和
制作步骤。)

“a.out”风格 建立
按照上面的步骤进行,但是让 perl_.exe (参见“perl_.exe”)由

使 perl_

测试和安装

进行 aout_test
制作 aout_install

手动放置 perl_.exe 到 PATH 上的某个位置。

注意事项。 “perl_”的构建过程 而不去 知道 关于所有的依赖关系,所以你
应该确保任何东西都是最新的,比如,通过做

制作 perl_dll

第一。

构建 a 二进制 分配


[本节仅提供简短概述...]

根据您安装的 perl 版本,构建应该以不同的方式进行
已经存在并在您的系统上使用,或者是尚未使用的新版本。 这
下面的描述假设版本是新的,所以安装它的 DLL 和 。下午
即使尚未执行某些中间步骤,也不会中断系统的运行
充分工作。

其他情况需要更复杂的程序。 下面我假设
Perl 的当前版本是 5.8.2,因此相应地命名了可执行文件。

1. 完全构建和测试 Perl 发行版。 确保没有测试失败
“测试”和“aout_test”目标; 修复 Perl 中的错误和检测到的 Perl 测试套件
通过这些测试。 确保“all_test”使目标运行尽可能干净。
检查一下 os2/perlrexx.cmd 运行良好。

2. 完全安装 Perl,包括“installcmd”目标。 将生成的 DLL 复制到
"库路径"; 复制编号的 Perl 可执行文件(如 perl5.8.2.exe) 到“路径”; 复制
"perl_.exe" 到 "PATH" 为 "perl_5.8.2.exe"。 想想你是否需要向后——
兼容性 DLL。 在大多数情况下,您还不需要安装它们; 但有时
这可以简化以下步骤。

3.确保“CPAN.pm”可以从CPAN下载文件。 如果没有,您可能需要
手动安装“Net::FTP”。

4. 安装包“Bundle::OS2_default”

perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_1

这在 1GHz 处理器上可能需要几个小时(第一次运行时)。 还有这个
不一定是一个顺利的过程。 某些模块可能未指定必需
依赖关系,因此可能需要多次重复此过程,直到结果
稳定。

perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_2
perl5.8.2 -MCPAN -e "install Bundle::OS2_default" < nul |& tee 00cpan_i_3

即使在它们稳定之后,一些测试也可能会失败。

修复尽可能多的发现的错误。 记录所有未修复的错误,
以及所有不明原因的失败。 检查生成的日志 00cpan_i_1
发现可疑的跳过测试和其他可疑事件。

请记住 安装 的某些模块也可能失败:例如,DLL
更新可能已经被加载 CPAN.pm. 检查“安装”日志(在示例中
以上 00cpan_i_1 等)错误,并手动安装东西,如

cd $CPANHOME/.cpan/build/Digest-MD5-2.31
使安装

某些发行版可能无法通过某些测试,但您可能仍想安装它们(如
以上,或通过“CPAN.pm”外壳模式的“强制安装”命令)。

由于此过程可能需要很长时间才能完成,因此
通过禁用本地副本的定期更新来“冻结”您的 CPAN 配置
CPAN 索引:将“index_expire”设置为一些大值(我使用 365),然后保存设置

CPAN> o conf index_expire 365
CPAN> o conf 提交

完成后重置回默认值 1。

5. 对结果满意后,重新运行“installcmd”目标。 现在你可以复制
"perl5.8.2.exe" 到 "perl.exe",并安装其他 OMF-build 可执行文件:
"perl__.exe" 等。它们已准备好使用。

6.切换到构建树的“./pod”目录,下载Perl logo
驼灰大.BMP,然后运行

( perl2ipf > perl.ipf ) |& tee 00ipf
ipfc /INF perl.ipf |& tee 00inf

这将生成 Perl 文档在线书籍“perl.INF”。 安装在“书架”路径上。

7. 现在是构建静态链接可执行文件的时候了 perl_.exe 其中包括新——
通过“Bundle::OS2_default”模块安装。 通过“CPAN.pm”进行测试将
非常缓慢,因为它静态链接每个 XS 扩展的新可执行文件。

这是一个可能的解决方法:创建一个顶层 生成文件 in $CPANHOME/.cpan/build/
内容为(与“使用自定义集合制作可执行文件”进行比较
静态加载的扩展")

使用 ExtUtils::MakeMaker;
WriteMakefile NAME => 'dummy';

执行此为

perl_5.8.2.exe Makefile.PL
make -k 全部测试

同样,这个过程不应该是绝对顺利的。 一些“Makefile.PL”在
子目录可能有问题,并且不会作为“子”脚本运行。 这
模块的相互依赖性可能会让您感到震惊; 然而,由于非 XS 模块已经
安装后,大多数模块的先决条件都有很好的机会出现。

如果您发现一些小故障,请将有问题的模块的目录移动到不同的
地点; 如果这些模块是非 XS 模块,您可以忽略它们——它们是
已安装; 剩下的,XS,模块你需要一一手动安装。

每次删除后,您都需要重新运行“Makefile.PL”/“make”进程; 通常
这个过程很快收敛。 (但一定要转换所有必要的外部 C
图书馆来自 .lib 格式化为 .a 格式:运行其中之一

emxaout foo.lib
emximp -o foo.a foo.lib

以适当的为准。)另外,请确保外部库的 DLL 是
可与没有“-Zmtd”选项编译的可执行文件一起使用。

当您确定只有少数子目录会导致失败时,您可能需要添加
“-j4”选项“make”以加速跳过已经完成的子目录
建立。

当您对测试结果感到满意时,请安装用于构建的 C 库
扩充功能:

进行安装 |& tee 00aout_i

现在您可以重命名文件 ./perl.exe 在最后阶段产生的
perl_5.8.2.exe; 把它放在“PATH”上; 如果某些 XS 之间存在相互依赖关系
模块,您可能需要使用这个新的可执行文件重复“测试”/“安装”循环
一些被排除的模块 - 直到程序收敛。

现在你拥有了所有必要的 .a 这些 Perl 模块的库位于以下位置
Perl builder 可以找到它。 使用 perl 构建器:切换到一个空目录,创建
一个“假人” 生成文件 再次运行

perl_5.8.2.exe Makefile.PL |& tee 00c
制作 perl |& tee 00p

这应该创建一个可执行文件 ./perl.exe 带有所有静态加载的扩展
内置。比较生成的 维护文件 文件以确保在
迭代加载扩展的数量只会增加。 改名 ./perl.exe
perl_5.8.2.exe 在“路径”上。

当它收敛时,你得到了一个函数变体 perl_5.8.2.exe; 复制到
“perl_.exe”。 您已完成本地 Perl 安装的生成。

8. 确保安装的模块确实安装在新的位置
Perl,并且不是从 @INC 的条目中继承的,该条目是从旧的继承而来的
Perl 版本:设置“PERLLIB_582_PREFIX”以将新版本的 Perl 重定向到
新位置,并将安装的文件复制到这个新位置。 重做测试
确保从旧版本 Perl 继承的模块版本不是
需要。

实际上,日志输出 pod2ipf(1) 在第 6 步中给出了非常详细的信息
关于从哪个地方加载哪些模块; 所以你可以把它用作额外的
验证工具。

检查一些临时文件没有进入 perl 安装树。 跑
这样的事情

找到。 -f "!(/\.(pm|pl|ix|al|h|a|lib|txt|pod|imp|bs|dll|ld|bs|inc|xbm|yml|cgi|uu|e2x|skip |packlist|eg|cfg|html|pub|enc|all|ini|po|pot)$/i 或 /^\w+$/") | 较少的

在安装树中(顶部和 站点库 一)。

使用以下命令压缩所有 DLL 力士达. 微小的 。可执行程序 可以用“/c:max”压缩(
错误仅在页面的最后 6 个字节中存在修复时出现(?); 自从
微小的可执行文件比页面小得多,错误不会发生)。 不要压缩
"perl_.exe" - 它在 DOS 下不起作用。

9. 现在您可以生成二进制分发版了。 这是通过运行测试来完成的
CPAN 分发版“OS2::SoftInstaller”。 调整文件 测试文件 以适应布局
首先是当前版本的 Perl。 不要忘记打包必要的外部 DLL
因此。 包括对错误和测试套件失败的描述
不修。 包括来自 Perl 构建的 Perl 可执行文件的小堆栈版本
目录。

包括 perl5.def 以便人们可以重新链接保留二进制文件的 perl DLL
兼容性,或者可以创建兼容性 DLL。 包括差异文件(“diff -pu
old new") 您所做的修复,以便人们可以重建您的版本。包括 perl5.地图
这样就可以使用远程调试了。

10. 与其他人分享你所做的事情。 放松。 享受你的工作成果。

11. 为感谢、错误报告、仇恨邮件和垃圾邮件做好准备
前一步。 任何善行都不应逍遥法外!

构建 定制 。EXE


Perl 可执行文件可以随时轻松重建。 此外,可以使用
嵌入 接口(见 perlembed)来制作非常定制的可执行文件。

制作 可执行文件 - a 定制 采集 of 静态地 扩展
这样做更容易一点,而 减少 静态加载的列表
扩展名。 我们只在这里讨论这个案例。

1.切换到一个空目录,并创建一个占位符:

使用 ExtUtils::MakeMaker;
WriteMakefile NAME => 'dummy';

2. 用 Perl 的味道运行它 (perl.exe所在 or perl_.exe) 你想重建。

perl_Makefile.PL

3. 让它创建新的 Perl 可执行文件:

制作 perl

(您可能需要在某些命令行上手动添加“PERLTYPE=-DPERL_CORE”
Perl 版本; 症状是命令行通配符不起作用
带有新编译的可执行文件的 OS/2 shell; 检查

.\perl.exe -wle“为@ARGV 打印”*

).

4.上一步创建 维护文件 其中包含一个列表 新XS() 附近的电话
结尾。 删除不必要的调用,并重新运行

制作 perl

将生成自定义的可执行文件。

制作 可执行文件 - a 定制 搜索路径
默认的 perl 可执行文件足够灵活,可以支持大多数用法。 然而,一个人可能
想要更灵活的东西; 例如,一个人可能想找到 Perl DLL 相对于
EXE文件的位置; 或者在设置时可能想忽略环境
Perl-库搜索补丁等。

如果你填得舒服 嵌入 界面(见perlembed),这样的东西很容易
重复“使用自定义集合制作可执行文件”中概述的步骤
静态加载的扩展”,并进行更全面的编辑 主() of 维护文件.
不太想了解 Perl 的人可以重命名 主(),并做必要的
自定义修改 主() 它在适当的时间调用重命名的函数。

但是,还有第三种方式:perl DLL 导出 主() 函数和几个回调
自定义搜索路径。 下面是一个“Perl 加载器”的完整示例,它

1.在“$exedir/../dll”目录下寻找Perl DLL;

2. 将上述目录添加到“BEGINLIBPATH”;

3. 如果通过“BEGINLIBPATH”找到的 Perl DLL 与加载的不同,则失败
步骤1; 例如,另一个进程可能已经从“LIBPATH”或不同的
“BEGINLIBPATH”的值。 在这些情况下,需要修改系统设置
这样另一个进程要么不运行,要么从“BEGINLIBPATH”加载 DLL
带有“LIBPATHSTRICT=T”(在 2000 年 XNUMX 月之后的内核中可用)。

4. 从“$exedir/../dll/lib/”加载 Perl 库。

5. 使用来自“$exedir/../dll/sh/ksh.exe”的 Bourne shell。

为获得最佳结果,请使用与 Perl DLL 相同的选项编译下面的 C 文件。 然而,
即使可执行文件不是 EMX 应用程序,许多功能也可以工作,例如,
如果编译

gcc -Wall -DDOSISH -DOS2=1 -O2 -s -Zomf -Zsys perl-starter.c \
-DPERL_DLL_BASENAME=\"perl312F\" -Zstack 8192 -Zlinker /PM:VIO

这是示例 C 文件:

#定义 INCL_DOS
#定义 INCL_NOPM
/* 如果 os2.h 包含 os2tk.h,而不是 os2emx.h,则编译需要这些 */
#定义 INCL_DOSPROCESS
#包括

#include "EXTERN.h"
#定义 PERL_IN_MINIPERLMAIN_C
#include "perl.h"

静态字符*我;
HMODULE 手柄;

静态空隙
die_with(char *msg1, char *msg2, char *msg3, char *msg4)
{
乌龙c;
char *s = " 错误:";

DosWrite(2, 我, strlen的(我), &c);
DosWrite(2, s, strlen(s), &c);
DosWrite(2, 消息 1, strlen的(msg1), &c);
DosWrite(2, 消息 2, strlen的(msg2), &c);
DosWrite(2, 消息 3, strlen的(msg3), &c);
DosWrite(2, 消息 4, strlen的(msg4), &c);
DosWrite(2, "\r\n", 2, &c);
出口(255);
}

typedef ULONG (*fill_extLibpath_t)(int 类型, char *pre, char *post, int 替换, char *msg);
typedef int (*main_t)(int 类型, char *argv[], char *env[]);
typedef int (*handler_t)(void* data, int which);

#ifndef PERL_DLL_BASENAME
# 定义 PERL_DLL_BASENAME "perl"
#ENDIF

静态模块
load_perl_dll(char *基本名称)
{
字符缓冲区[300],失败[260];
STRLEN l, 迪尔;
fill_extLibpath_t f;
ULONG rc_fullname;
HMODULE 句柄,句柄 1;

如果 (_execname(buf, sizeof(buf) - 13) != 0)
die_with("找不到完整路径:", strerror(errno), "", "");
/* XXXX 用新值填充“我”*/
l = strlen(buf);
while (l && buf[l-1] != '/' && buf[l-1] != '\\')
l--;
目录 = l - 1;
strcpy(buf + l, 基名);
l += strlen(基名);
strcpy(buf + l, ".dll");
if ( (rc_fullname = DosLoadModule(fail, sizeof fail, buf, &handle)) != 0
&& DosLoadModule(fail, sizeof fail, basename, &handle) != 0 )
die_with("无法加载DLL", buf, "", "");
如果(rc_fullname)
返回句柄; /* 加载了短名称; 一切都很好 */
if (DosQueryProcAddr(handle, 0, "fill_extLibpath", (PFN*)&f))
die_with(buf, ": DLL 没有导出符号 ", "fill_extLibpath", "");
buf[目录] = 0;
if (f(0 /*BEGINLIBPATH*/, buf /* 前置 */, NULL /* 附加 */,
0 /* 保留旧值 */, me))
die_with(me, ": 前置 BEGINLIBPATH", "", "");
if (DosLoadModule(fail, sizeof fail, basename, &handle1) != 0)
die_with(me, ": 再次通过 BEGINLIBPATH 找到 perl DLL", "", "");
buf[dirl] = '\\';
如果(句柄1!=句柄){
如果 (DosQueryModuleName(handle1, sizeof(fail), fail))
strcpy(失败,“???”);
die_with(buf, ":\n\tperl DLL via BEGINLIBPATH 是不同的:\n\t",
失败,
"\n\t您可能需要操作全局 BEGINLIBPATH 和 LIBPATHSTRICT"
"\n\t 以便通过 BEGINLIBPATH 加载另一个副本。");
}
返回句柄;
}

INT
主要(int argc,char **argv,char **env)
{
main_t f;
handler_th;

我 = argv[0];
/ ** /
句柄 = load_perl_dll(PERL_DLL_BASENAME);

if (DosQueryProcAddr(handle, 0, "Perl_OS2_handler_install", (PFN*)&h))
die_with(PERL_DLL_BASENAME, ": DLL 没有导出符号 ", "Perl_OS2_handler_install", "");
if (!h((void *)"~installprefix", Perlos2_handler_perllib_from)
|| !h((void *)"~dll", Perlos2_handler_perllib_to)
|| !h((void *)"~dll/sh/ksh.exe", Perlos2_handler_perl_sh) )
die_with(PERL_DLL_BASENAME, ": Can't install @INC manglers", "", "");

if (DosQueryProcAddr(handle, 0, "dll_perlmain", (PFN*)&f))
die_with(PERL_DLL_BASENAME, ": DLL 没有导出符号 ", "dll_perlmain", "");
返回 f(argc, argv, env);
}

构建 常见问题


“/” 成为 “\” in pdksh。
你有一个很旧的 pdksh。 请参阅“先决条件”。

'错误' - 未解决 外部
你没有 MT-safe 数据库. 请参阅“先决条件”。

问题 - tr or 口渴
报告了非常旧版本的 tr 和 sed。

问题 (忘记 ;-)
你有一个旧版本的 文件 在你的 LIBPATH 上,它破坏了构建
扩展。

自学资料库 ... 而不去 发现
您没有运行“omflibs”。 请参阅“先决条件”。

赛格福 in 使
您使用的是旧版本的 GNU make。 请参阅“先决条件”。

操作/sprintf 测试 失败
这可能是由 emx sprintf 中的错误导致的,该错误已在 0.9d fix 03 中修复。

获得每个 (错误)功能 of OS / 2 端口


"设置优先级", “获得优先权”
请注意,这些函数与 *nix 兼容,而不是与 '94 - 95 的旧端口兼容。
优先级是绝对的,从 32 到 -95,越低越快。 0 是默认值
优先。

警告. 在不存在的进程上调用“getpriority”可能会在之前锁定系统
Warp3 fixpak22。 从 Warp3 开始,Perl 将使用一种解决方法:它中止 获取优先级()
如果进程不存在。 这在旧版本“2.*”上是不可能的,并且有
反正比赛条件。

“系统()”
“system()”的多参数形式允许额外的数字参数。 的含义
这个参数在 OS2::Process 中有描述。

当找到要运行的程序时,Perl 首先要求操作系统在“PATH”上查找可执行文件
(OS/2 添加扩展 。可执行程序 如果没有扩展名)。 如果没有找到,它会寻找一个
按以下顺序添加可能的扩展名的脚本:无扩展名, .CMD, .btm的, 。BAT, 特等.
如果找到,Perl 会检查文件开头是否有魔法字符串“#!” 和“extproc”。 如果
发现,Perl 使用第一行的其余部分作为命令行的开始来运行
这个脚本。 对第一行所做的唯一修改是提取参数
(目前最多 3 个),如果不能,则忽略“解释器”名称的路径部分
使用完整路径可以找到。

例如,“system 'foo', 'bar', 'baz'” 可能会导致 Perl 找到 C:/emx/bin/foo.cmd
第一行是

程序 / bin / bash -x -c

If /bin/bash.exe 未找到,然后 Perl 查找可执行文件 bash.exe 在“路径”上。 如果
在发现 C:/emx.add/bin/bash.exe,那么上面的 系统() 被翻译成

系统 qw(C:/emx.add/bin/bash.exe -x -c C:/emx/bin/foo.cmd bar baz)

执行一个额外的翻译:而不是 / bin / sh的 Perl 使用 hardwired-or-
自定义外壳(请参阅“PERL_SH_DIR”)。

上面对“解释器”的搜索是递归的:如果 打坏 找不到可执行文件,但是
bash.btm文件 找到了,Perl 将调查它的第一行等等。唯一的硬连线限制
递归深度是隐式的:附加参数的数量限制为 4
在给定的实际参数之前插入 系统(). 特别是如果没有额外的
在“magic”第一行指定参数,然后深度限制为 4。

如果 Perl 在当前会话不是 PM 类型的情况下发现找到的可执行文件,它
将在必要类型的单独会话中启动新进程。 呼叫通过
"OS2::Process" 来禁用这个魔法。

警告. 由于所描述的逻辑,您需要明确指定 .com 扩展如果
需要。 此外,如果可执行文件 perl5.6.1 被请求,Perl 不会查找
perl5.6.1.exe. [这在未来可能会改变。]

“外加工” on 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 第一 线
如果 Perl 脚本的第一个字符是“extproc”,则该行被视为“#!”行,
因此该行上的所有开关都被处理(如果脚本是通过
cmd.exe)。 请参阅 perlrun 中的“描述”。

额外 模块:
OS2::Process、OS2::DLL、OS2::REXX、OS2::PrfDB、OS2::ExtAttr。 这些模块提供访问
“系统”的附加数字参数和有关运行的信息
进程、具有 REXX 签名的函数的 DLL 和 REXX 运行时、OS/2
数据库中的 .INI文件 格式和扩展属性。

Andreas Kaiser 的另外两个扩展,“OS2::UPM”和“OS2::FTP”,包含在
“ILYAZ”目录,镜像在 CPAN 上。 其他与 OS/2 相关的扩展也可用。

预建 方法:
“文件::复制::系统拷贝”
由“File::Copy::copy”使用,请参阅 File::Copy。

“DynaLoader::mod2fname”
由“DynaLoader”用于 DLL 名称修改。

“Cwd::current_drive()”
不言自明。

"Cwd::sys_chdir(name)"
按原样离开驱动器。

“Cwd::change_drive(名称)”
更改“当前”驱动器。

“Cwd::sys_is_absolute(名称)”
表示有驱动器号和 is_rooted。

"Cwd::sys_is_rooted(name)"
意味着有前导“[/\\]”(可能在驱动器号之后:)。

"Cwd::sys_is_relative(name)"
意味着随着当前目录的变化。

“Cwd::sys_cwd(名称)”
从 EMX 到 cwd 的接口。 由“Cwd::cwd”使用。

“Cwd::sys_abspath(名称,目录)”
要实现的功能真的很可恶。 返回文件的绝对名称
如果 CWD 是“dir”,则有“name”。 “目录”默认为当前目录。

"Cwd::extLibpath([类型])"
获取扩展库搜索路径的当前值。 如果“类型”存在且为正,
与“END_LIBPATH”一起使用,如果为负,则与“LIBPATHSTRICT”一起使用,否则与
“BEGIN_LIBPATH”。

“Cwd::extLibpath_set(路径[,类型])”
设置扩展库搜索路径的当前值。 如果“类型”存在且为正,
与,如果为负,则与“LIBPATHSTRICT”一起使用,否则与
“BEGIN_LIBPATH”。

"OS2::Error(do_harderror,do_exception)"
如果尚未调用,则返回“undef”,否则如果在前一个
调用 do_harderror 已启用,如果在上一次调用 do_exception 时设置了第 2 位
启用。

此功能启用/禁用与硬件错误相关的错误弹出窗口(磁盘不是
准备好等)和软件异常。

我不知道如何找出弹出窗口的状态 before 第一次调用这个
功能。

“OS2::Errors2Drive(驱动器)”
如果尚未调用,则返回“undef”,否则,如果未调用错误,则返回 false
请求写入硬盘驱动器,或驱动器号(如果需要)。

此功能可能会重定向与硬件错误相关的错误弹出窗口(磁盘不是
准备等)和软件异常的根目录下的文件POPUPLOG.OS2
指定的驱动器。 覆盖 OS2::错误() 由个别程序指定。 给定的
参数 undef 将禁用重定向。

具有全局效果,应用程序退出后仍然存在。

我不知道如何找出弹出窗口重定向到磁盘的状态 before 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。
首先调用这个函数。

OS2::系统信息()
返回带有系统信息的哈希值。 哈希的键是

MAX_PATH_LENGTH、MAX_TEXT_SESSIONS、MAX_PM_SESSIONS、
MAX_VDM_SESSIONS、BOOT_DRIVE、DYN_PRI_VARIATION、
MAX_WAIT、MIN_SLICE、MAX_SLICE、PAGE_SIZE、
VERSION_MAJOR、VERSION_MINOR、VERSION_REVISION、
MS_COUNT、TIME_LOW、TIME_HIGH、TOTPHYSMEM、TOTRESMEM、
TOTAVAILMEM、MAXPRMEM、MAXSHMEM、TIMER_INTERVAL、
MAX_COMP_LENGTH,FOREGROUND_FS_SESSION,
FOREGROUND_PROCESS 进程

OS2::启动驱动器()
返回一个没有冒号的字母。

"OS2::MorphPM(服务)", "OS2::UnMorphPM(服务)"
将当前应用程序转换为 PM 应用程序并返回。 论据为真
意味着将提供一个真正的消息循环。 OS2::MorphPM() 返回 PM
消息队列句柄为整数。

有关其他详细信息,请参阅“资源的集中管理”。

"OS2::Serve_Messages(force)"
对未完成 PM 消息的虚假按需检索。 如果“力”为假,则不会
如果已知存在真正的消息循环,则调度消息。 返回数量
检索到的消息。

如果获得 WM_QUIT 消息,则以“QUITing...”结束。

"OS2::Process_Messages(force [, cnt])"
检索 PM 消息,直到创建/销毁窗口。 如果“力”为假,将
如果已知存在真正的消息循环,则不发送消息。

返回窗口数量的变化。 如果给出“cnt”,它会增加
检索到的消息数。

如果获得 WM_QUIT 消息,则以“QUITing...”结束。

"OS2::_control87(new,mask)"
相同 _control87(3) EMX。 以整数为参数,返回前一个
协处理器控制字为整数。 只有出现在“new”中的位
“掩码”在控制字中发生了变化。

OS2::get_control87()
以整数形式获取协处理器控制字。

"OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)"
的变体 OS2::_control87() 具有适合处理异常掩码的默认值:
如果没有“掩码”,则仅使用“新”的异常掩码部分。 如果没有“new”,则禁用所有
浮点异常。

有关详细信息,请参阅“功能缺陷”。

"OS2::DLLname([how [, \&xsub]])"
提供有关 Perl DLL 或包含绑定到的 C 函数的 DLL 的信息
由 &xsub. “如何”的意思是:默认(2):全名; 0:句柄; 1:模块名称。

(请注意,其中一些可能会移至不同的库 - 最终)。

预建 变量:
$OS2::emx_rev
数值与EMX的_emx_rev相同,与_emx_vprt相同的字符串值
(类似于“0.9c”)。

$OS2::emx_env
与EMX的_emx_env相同,类似0x8001的数字。

$OS2::os_ver
一个数字“OS_MAJOR + 0.001 * OS_MINOR”。

$OS2::is_aout
如果 Perl 库是以 AOUT 格式编译的,则为 true。

$OS2::can_fork
如果当前可执行文件是 AOUT EMX 可执行文件,则为 true,因此 Perl 可以 fork。 不要
使用这个,使用 $Config::Config{dfork} 的便携式检查。

$OS2::nsys错误
此变量(默认为 1)控制是否强制 $^E 的内容启动
带有类似“SYS0003”的 ID。 如果设置为 0,那么 $^E 的字符串值是什么
可从 OS/2 消息文件中获得。 (此文件中的某些消息具有
“SYS0003”-like id 前置,有些不是。)

缺陷
· 自从 羊群(3) 存在于 EMX 中,但没有功能,它由 perl 模拟。 到
禁用仿真,设置环境变量“USE_PERL_FLOCK=0”。

· 以下是 EMX 上可能“损坏”的内容列表(来自 EMX 文档):

· 功能 接收消息(3) 发送消息(3), 套接字对(3) 未实施。

· 袜子初始化(3) 不是必需的,也没有实施。

· 羊群(3) 尚未实现(虚拟函数)。 (Perl 有一个解决方法。)

· (3):PID=0、PID=1、PID=-1的特殊处理没有实现。

· 等待进程(3):

无痕
未实现。
对于 PID 的负值,未实现 waitpid()。

请注意,“kill -9”不适用于当前版本的 EMX。

· 请参阅“文本模式文件句柄”。

· OS/2 上的 Unix 域套接字存在于伪文件系统“/sockets/...”中。 为了避免一个
未能创建具有不同形式名称的套接字,"/socket/" 被添加到
套接字名称(除非它已经以此开头)。

如果通过“通常”文件访问套接字,这可能会导致稍后出现问题 -
使用“初始”名称的系统调用。

· 显然,IBM 使用了一个编译器(在 95 年左右的一段时间内?)它改变了 FP
左右掩膜。 这不是 对 IBM 的程序不利,但编译器相同
用于与通用应用程序一起使用的 DLL。 当这些 DLL
使用时,应用程序中浮点标志的状态是不可预测的。

更糟糕的是,一些 DLL 在 _DLLInitTerm()
(例如, TCP32IP)。 这意味着即使你不 呼叫 DLL 中的任何函数,
只是加载此 DLL 的行为将重置您的标志。 更糟糕的是,同样的
编译器用于编译一些 HOOK DLL。 鉴于 HOOK dll 在
的上下文 所有 系统中的应用程序,这意味着完全不可预测性
使用此类 HOOK DLL 的系统上的浮点标志。 例如, 游戏SRVR.DLL of 潜水
origin 在每次写入 VIO 的 TTY 时更改浮点标志(窗口化
文本模式)应用程序。

FP 标志更改时的其他一些(未完全调试)情况包括
视频驱动程序 (?),以及一些与创建窗口相关的操作。 那些
OpenGL的 可能在这方面有更多的经验。

Perl一般用于所有浮点异常的情况
忽略,这是 EMX 下的默认设置。 如果它们不被忽略,一些良性的 Perl
程序会得到一个“SIGFPE”并且会死得很惨。

为了规避这一点,Perl 使用了两个技巧。 他们帮助对抗 一种 仅损坏类型:
加载 DLL 时更改了 FP 标志。

技巧之一是在 Perl 启动时禁用浮点异常(就像
默认使用 EMX)。 这仅有助于编译时链接的 DLL 更改标志
before 主() 有机会被召唤。

另一个 hack 是在调用后恢复 FP 标志 dlopen(). 这有助于对抗
DLL 造成的类似损害 _DLLInitTerm() 在运行时。 目前没有办法切换
提供了这些技巧。

修改
Perl 通过以下方式修改了一些标准的 C 库调用:

"popen" "my_popen" 使用 sh.exe 如果需要外壳,请参见。 “PERL_SH_DIR”。

“tmpnam”是通过“tempnam”使用“TMP”或“TEMP”环境变量创建的。

“tmp文件”
如果当前目录不可写,则使用修改创建文件
“tmpnam”,所以可能存在竞争条件。

“ctermid”
一个虚拟的实现。

"stat" "os2_stat" 特殊情况 /开发/ tty/开发/控制.

“mkdir”,“rmdir”
如果路径包含尾随的“/”,这些 EMX 函数将不起作用。 珀尔
包含一个解决方法。

“蜂拥而至” 羊群(3) 存在于 EMX 中,但没有功能,它由 perl 模拟。
要禁用仿真,请设置环境变量“USE_PERL_FLOCK=0”。

确定 DLL文件
使用当前版本的 Perl 构建的所有 DLL 都有标识名称的 ID 字符串
此 DLL 所需的扩展名、版本和 Perl 版本。 跑
“bldlevel DLL-name”以查找此信息。

中心化 管理 of 资源
由于调用某些 OS/2 API 需要有一个正确初始化的“Win”子系统,
OS/2 特定的扩展可能需要获得“HAB”和“HMQ”。 如果扩展会做
它本身,另一个扩展可能无法初始化。

Perl 提供了对这些资源的集中管理:

“HAB”
要获得 HAB,扩展应在 C 中调用“hab = perl_hab_GET()”。在此之后
调用时,“hab”可以作为“Perl_hab”访问。 没有必要释放
使用后的 HAB。

如果由于某些原因 文件 不能包含,使用

外部 int Perl_hab_GET(无效);

代替。

“HMQ”
有两种情况:

· 扩展需要一个“HMQ”只是因为某些 API 将无法正常工作。 利用
“服务= 0”下面。

· 扩展需要一个“HMQ”,因为它想参与一个 PM 事件循环。 利用
“服务= 1”下面。

要获得“HMQ”,扩展应该在 C 中调用“hmq = perl_hmq_GET(serve)”。之后
执行此调用,“hmq”可以作为“Perl_hmq”访问。

要向 Perl 发出不再需要 HMQ 的信号,请调用“perl_hmq_UNSET(serve)”。 珀尔
如果 HMQ 是
需要/不需要。 Perl 将自动启用/禁用“WM_QUIT”消息
如果消息队列已提供/未提供服务,则关闭。

注意. 如果在关闭期间有一个没有禁用 WM_QUIT 的消息队列,
并且没有处理接收到的 WM_QUIT 消息,关机将是
自动取消。 不要打电话 perl_hmq_GET(1) 除非你要处理
消息有序。

处理 OS/2 API 报告的错误
有两个主要约定(将它们称为“Dos*”和“Win*”很有用 -
尽管函数签名的这一部分并不总是由函数的名称决定
API) 报告 OS/2 API 的错误情况。 大多数“Dos*”API 报告
作为调用结果的错误代码(所以 0 表示成功,并且有很多种
错误)。 大多数“Win*” API 通过结果为“TRUE”/“FALSE”来报告成功/失败;
找出失败的原因应该打电话 WinGetLastError() 函数 API。

一些“Win*”入口点也会使“有意义”的返回值过载并出现错误
指标; 返回值为 0 表示错误。 还有一些其他的“Win*”条目
点使事情更重,0 返回值可能意味着成功调用
返回一个有效值 0,以及一个错误条件; 在返回 0 的情况下
价值一应该打电话 WinGetLastError() 函数 用于区分成功调用和调用的 API
失败之一。

按照惯例,所有对 OS/2 API 的调用都应该通过重置来指示它们的失败
$^E。 所有调用 OS/2 API 的 Perl 可访问函数都可以分为两个
班级:一些 模具()s 当遇到 API 错误时,另一个通过
一个错误的返回值(当然,这与 Perl 可访问的函数无关
期望 OS/2 API 调用失败,编码了一些变通方法)。

显然,在最后一种类型的 OS/2 API 签名的情况下,它是
如果出现故障,则必须更方便用户 模具()ing:一个是
不需要检查 $^E 就知道出了什么问题。 但是,如果此解决方案
由于某种原因是不可取的,有问题的代码应该在之前将 $^E 重置为 0
进行此 OS/2 API 调用,以便此 Perl 可访问函数的调用者具有
有机会将成功但 0 的返回值与失败区分开来。 (一个可以返回
undef 作为报告错误的另一种方式。)

简化这种错误传播的宏是

“CheckOSError(expr)”
出错时返回 true,设置 $^E。 期待 表达式() 调用“Dos*”风格的 API。

“CheckWinError(expr)”
出错时返回 true,设置 $^E。 期待 表达式() 调用“Win*”风格的 API。

“SaveWinError(expr)”
返回“expr”,从设置 $^E WinGetLastError() 函数 如果“expr”是假的。

“SaveCroakWinError(expr,die,name1,name2)”
返回“expr”,从设置 $^E WinGetLastError() 函数 如果“expr”是假的,并且 模具()如果
“死”和 $^E 是真的。 死的消息是连接的字符串“name1”
和“name2”,用“:”与$^E 的内容隔开。

“WinError_2_Perl_rc”
将“Perl_rc”设置为 WinGetLastError() 函数.

“填充错误”
将“Perl_rc”设置为 WinGetLastError() 函数, 并将 $^E 设置为
相应的值。

“FillOSError(rc)”
将“Perl_rc”设置为“rc”,并将 $^E 设置为相应的值。

加载 DLL 和 DLL 中的序数
某些 DLL 仅存在于某些版本的 OS/2 或某些配置中
操作系统/2。 某些导出的入口点仅存在于某些版本附带的 DLL 中
操作系统/2。 如果这些 DLL 和入口点直接链接到 Perl
可执行文件/DLL 或来自 Perl 扩展,此二进制文件仅适用于
指定的版本/设置。 即使不需要这些入口点, 加载 of
可执行文件(或 DLL)将失败。

例如,OS/2 v2 中不存在许多更新的有用 API; 许多与 PM 相关的 API
要求 DLL 在软盘引导设置中不可用。

使这些调用失败 仅由 ,尤其是 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 电话 旨在 执行,应该调用这些 API
通过动态链接 API。 Perl 中有一个子系统来简化这种类型的
调用。 提供了大量可用于此类链接的入口点(请参阅
“entries_ordinals”——以及“PMWIN_entries”——在 os2ish.h)。 这些序数可以是
通过 API 访问:

CallORD()、DeclFuncByORD()、DeclVoidFuncByORD()、
DeclOSFuncByORD()、DeclWinFuncByORD()、AssignFuncPByORD()、
DeclWinFuncByORD_CACHE(), DeclWinFuncByORD_CACHE_survive(),
DeclWinFuncByORD_CACHE_resetError_survive(),
DeclWinFunc_CACHE(), DeclWinFunc_CACHE_resetError(),
DeclWinFunc_CACHE_survive()、DeclWinFunc_CACHE_resetError_survive()

请参阅所提供的 OS/2 相关模块中的头文件和 C 代码以了解
有关这些功能使用的详细信息。

其中一些函数还结合了动态加载语义和错误传播
上面讨论的语义。

Perl的 口味


由于 OS/2 的特性,人们不可能将所有鸡蛋放在同一个篮子里(尽管
EMX 环境努力克服这个限制,所以情况可能会以某种方式
提升)。 发行版提供了 4 个 Perl 可执行文件:

perl.exe所在
主力军。 这是一个嵌合体可执行文件:它被编译为“a.out”风格
可执行文件,但与“omf”风格的动态库链接 文件, 和动态 CRT
动态链接库。 这个可执行文件是一个 VIO 应用程序。

它可以加载 perl 动态扩展,并且可以 叉子().

注意事项。 请记住 叉子() 需要为自己打开管道。

perl_.exe
这是一个静态链接的“a.out”样式的可执行文件。 它无法加载动态 Perl
扩展名。 二进制发行版中提供的可执行文件有很多扩展
预构建,因此上述限制仅在您使用自定义扩展时才重要。
这个可执行文件是一个 VIO 应用程序。

本篇 is 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 仅由 可执行 - 而不去 要求 操作系统/2。 锁定“M$”世界的朋友
很高兴这个可执行文件在 DOS、Win0.3*、Win0.95 和 WinNT 下运行
使用适当的扩展器。 请参阅“其他操作系统”。

perl的__。可执行程序
这是相同的可执行文件 perl的___。可执行程序,但它是一个PM应用程序。

注意事项。 通常(除非在启动期间明确重定向)STDIN、STDERR 和 STDOUT
一个 PM 应用程序被重定向到 。 但是,有可能 请点击 他们,如果你
从模拟控制台窗口的 PM 程序启动“perl__.exe”,例如 外壳 模式 of
Emacs 或 EPM。 因此它 is 可能 使用 Perl 调试器(见 perldebug)来调试你的 PM
应用程序(但要注意消息循环锁定 - 如果您有一个
要服务的消息队列,除非您将服务挂钩到 获取() 的功能
调试器)。

查看 PM 程序输出的另一种方法是将其运行为

pm_prog 参数 2>&1 | 猫 -

带壳 不同CMD.EXE,这样它就不会在 VIO 之间创建链接
session 和“pm_porg”的会话。 (这样的链接会关闭 VIO 窗口。)例如,这个
作品 sh.exe - 或使用 Perl!

打开 P, 'pm_prog args 2>&1 |' 或者死;
打印时;

味道 perl的__。可执行程序 如果您想在没有 VIO 窗口的情况下启动程序,则需要
存在,但未“分离”(运行“帮助分离”以获取更多信息)。 对扩展非常有用
使用 PM,如“Perl/Tk”或“OpenGL”。

另请注意,PM 和 VIO 可执行文件之间的区别仅在于 默认
行为。 一个可以开始 任何 可执行于 任何 使用参数的会话类型
“/fs”、“/pm”或“/win”命令“start”(的 命令文件 或类似的外壳)。
或者,可以使用“系统”Perl 函数的第一个数字参数(请参阅
OS2::进程)。

perl的___。可执行程序
这是一个“omf”风格的可执行文件,它动态链接到 文件 和 CRT DLL。 一世
不知道这个可执行文件比“perl.exe”有什么优势,但它不能 叉子() 根本。 好,
一个优点是构建过程不像“perl.exe”那样复杂。

它是一个 VIO 应用程序。

奇怪 名字?
由于 Perl 处理“#!”行(参见 perlrun 中的“DESCRIPTION”,在
perlrun, "No Perl script found in input" in perldiag),它应该知道程序何时 is a
Perl的. 有一些命名约定允许 Perl 区分正确的行和
错误的。 上述名称几乎是本公约允许的唯一名称
不包含数字(具有完全不同的语义)。

动态 链接?
好吧,有几个可执行文件动态链接到同一个巨大的库有它的
优点,但这不会证实额外的工作来使其编译。 这
原因是对开发人员来说很复杂,但对用户来说非常快速和方便“难”
OS/2 使用的动态链接。

OS/2 的动态链接模型有两个显着特点:第一,所有的
在编译时解析对外部函数的引用; 第二,没有
DLL 加载到内存后的运行时修复。 第一个特点是
与其他模型相比的巨大优势:当多个 DLL 被一个人使用时,它避免了冲突
具有相同名称的应用程序导出条目。 在这种情况下,“其他”动态模型
链接只是使用一些随机标准在这两个入口点之间进行选择 - 与
可预见的灾害作为结果。 但这是第二个需要构建的功能
of 文件.

DLL 的地址表仅在加载时修补一次。 的地址
DLL 的入口点保证对于所有使用的程序都是相同的
相同的 DLL。 这将删除运行时修复 - 一旦加载了 DLL,它的代码就是只读的。

虽然这会带来一些(显着的?)性能优势,但这会让生活变得更加艰难
对于开发人员来说,由于上述方案使得 DLL 不可能“链接”到
中的符号 。EXE 文件。 实际上,这需要一个 DLL 来进行不同的重定位
使用此 DLL 的(不同)可执行文件的表。

但是,动态加载的 Perl 扩展被迫使用 perl 中的一些符号
可执行文件,例如,知道如何找到函数的参数:参数实时
在 perl 内部评估堆栈上。 解决办法是把主代码
解释器转换成一个 DLL,并使 。EXE 只是将这个 DLL 加载到内存中的文件
提供命令参数。 扩展 DLL 无法链接到符号 。EXE,但它有
链接到符号没有问题 。DLL.

本篇 非常 增加了应用程序的加载时间(以及应用程序的复杂性)
汇编)。 由于解释器在 DLL 中,因此 C RTL 基本上被迫驻留在
DLL 也是如此(否则扩展将无法使用 CRT)。 有一些
如果您使用不同风格的 perl,例如运行 perl.exe所在perl的__。可执行程序
同时:他们共享记忆 文件.

注意. 还有一个额外的效果使 DLL 更加浪费:DLL 被加载到
共享内存区域,考虑到 512M 的屏障,这是一个稀缺资源
“标准”OS/2 虚拟内存。 的代码 。EXE 文件也被所有的人共享
使用特定的过程 。EXE,但它们“在私有地址空间中共享
的过程”;这是可能的,因为不同部分的地址
。EXE 文件被加载是在编译时决定的,因此所有进程都有这些
在相同地址加载的部分,并且没有修复内部链接 。EXE is
需要。

由于 DLL 可能在运行时加载,因此要对 DLL 使用相同的机制,需要
有地址范围 任何 of 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 系统中的 DLL 可用 in 所有 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。
工艺 它尚未加载特定的 DLL。 这就是 DLL 被映射到
共享内存区域。

嵌合体 建造?
当前的 EMX 环境不允许使用 Unixish "a.out" 格式编译的 DLL
导出数据(或至少某些类型的数据)的符号。 这会强制“omf”风格的编译
of 文件.

当前的 EMX 环境不允许 。EXE 以“omf”格式编译的文件 叉子().
叉子() 正好需要三个 Perl 操作:

· 明确的 叉子() 在脚本中,

· "打开FH,"|-""

· "open FH, "-|"",换句话说,打开管道到它自己。

虽然这些操作不是生死攸关的问题,但很多人都需要它们。
有用的脚本。 这会强制执行“a.out”风格的编译 perl.exe所在.

环境


在这里,我们列出了特定于 OS/2 和 DOS 以及 Win* 的环境变量,或者
在 OS/2 下比在其他操作系统下更重要。

"PERLLIB_PREFIX"
特定于 EMX 端口。 应该有表格

路径 1;路径 2

or

路径 1 路径 2

如果某些预建路径的开头匹配 路径1,它被替换为 路径2.

如果 perl 库优先从默认位置移动到
"PERL(5)LIB”,因为这不会在@INC 中留下错误的条目。例如,如果
perl 的编译版本在中查找 @INC f:/perllib/库,并且您要安装
在图书馆 h:/选择/gnu,我

设置 PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu

这将导致 Perl 带有预构建的 @INC

f:/perllib/lib/5.00553/os2
f:/perllib/lib/5.00553
f:/perllib/lib/site_perl/5.00553/os2
f:/perllib/lib/site_perl/5.00553
.

使用以下@INC:

h:/opt/gnu/5.00553/os2
h:/opt/gnu/5.00553
h:/opt/gnu/site_perl/5.00553/os2
h:/opt/gnu/site_perl/5.00553
.

“PERL_BADLANG”
如果为 0,perl 忽略 设置区域设置() 失败。 可能对一些奇怪的有用 当地s.

“PERL_BADFREE”
如果为 0,perl 不会在出现无根据的情况下发出警告 自由(). 对于较旧的 perls,这可能是
与模块 DB_File 结合使用时很有用,该模块在动态链接和
OMF 构建。

不应使用较新的 Perls 设置,因为这可能会隐藏一些 真实 问题。

“PERL_SH_DIR”
特定于 EMX 端口。 给出位置的目录部分 sh.exe.

“USE_PERL_FLOCK”
特定于 EMX 端口。 自从 羊群(3) 存在于 EMX 中,但不起作用,它是
由 perl 模拟。 要禁用仿真,请设置环境变量“USE_PERL_FLOCK=0”。

“TMP” or “温度”
特定于 EMX 端口。 用作临时文件的存储位置。

进化


在这里,我们列出了可能让您大吃一惊的重大变化。

文本模式 文件句柄
从 5.8 版开始,Perl 为文本模式文件使用内置的翻译层。
这用一些应该是最好的代码替换了有效的经过良好测试的 EMX 层
被称为“快速黑客”。

除了可能的错误和无法跟踪翻译政策的变化
使用 TERMIO 转换的关闭/打开开关,这引入了严重的不兼容更改:
before 系统读取() 文本模式文件句柄将通过翻译层,现在它
不会。

优先级
“setpriority”和“getpriority”与 Andreas Kaiser 的早期端口不兼容。
请参阅“setpriority,getpriority”。

DLL 姓名 处理: 5.6.2
在 5.003_01 版本中,动态加载库应该在
编译不同版本的 Perl。 特别是,DLL(包括 文件) 现在
使用包含校验和的名称创建,从而允许 OS/2 方案的解决方法
缓存 DLL。

可以编写一个简单的解决方法

· 通过旧的@INC 找到旧的 DLL;

· 根据新的 perl 方案修改名称并将 DLL 复制到这些名称;

· 编辑DLL的内部“LX”表以反映名称的变化(可能不是
Perl 扩展 DLL 需要,因为内部编码的名称不用于
“特定”DLL,它们仅用于“全局”DLL)。

· 编辑内部“IMPORT”表并更改“旧”表的名称 perl???.dll 以及
“新” perl???.dll.

DLL 姓名 处理: 5.6.2 以外
实际上对 延期 DLL 是由于对 OS/2 的误解而完成的
动态加载模型。 OS/2(有效地)维护了两个不同的加载 DLL 表:

全局 DLL
那些由“LIBPATH”中的基本名称加载的; 包括在链接时关联的那些;

特定的 DLL
按全名加载。

解析对全局 DLL 的请求时,已加载的特定 DLL 表是
(有效地)忽略; 此外,特定的 DLL 是 时刻 从指定路径加载。

有/曾经有一个小改动使这个方案变得脆弱:如何处理加载的 DLL


“BEGINLIBPATH”和“ENDLIBPATH”
(这取决于过程)

. 来自“LIBPATH”
取决于过程(尽管“LIBPATH”对于所有
流程)。

除非将“LIBPATHSTRICT”设置为“T”(并且内核在 2000/09/01 之后),否则此类 DLL 是
被认为是全球性的。 加载全局 DLL 时,它首先在
已加载的全局 DLL。 因此,一个可执行文件加载了一个 DLL
来自“BEGINLIBPATH”和“ENDLIBPATH”,或 . 来自“LIBPATH”可能会影响 DLL 已加载
,尤其是 另一个 可执行文件请求具有相同名称的 DLL。 本篇 是因为
perl DLL 的 DLL 名称的版本特定修改。

由于 Perl 扩展 DLL 总是使用完整路径加载,因此无需
以特定于版本的方式修改他们的名字:他们的目录已经反映了
perl 的相应版本,@INC 考虑到与旧版本的二进制兼容性
版本。 从 5.6.2 开始,名称修改方案固定为与 Perl 相同
5.005_53(与流行的二进制版本相同)。 因此新的 Perls 将能够 解决
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 名称 如果@INC 允许查找它们的目录,则旧扩展 DLL 的数量。

但是,这仍然不能保证可以加载这些 DLL。 原因是
改名 Perl的 DLL. 并且由于扩展 DLL 与 Perl 链接
DLL,旧版本的扩展 DLL 将加载旧的 Perl DLL,并且大多数
可能是段错误(因为此 DLL 中的数据未正确初始化)。

有一个部分解决方法(可以使用较新的 OS/2 内核来完成):创建
与旧版 Perl 的 DLL 同名的转发器 DLL,它转发
入口指向较新的 Perl 的 DLL。 使这个 DLL 可访问(比如)
新 Perl 可执行文件的“BEGINLIBPATH”。 当新的可执行文件访问旧的 Perl 时
扩展 DLL,他们会按名称请求旧的 Perl DLL,而是获取转发器,
如此有效地将与当前运行的(新的)Perl DLL 链接。

这可能会以两种方式打破:

· 旧的 perl 可执行文件在运行的新可执行文件加载了一个
为旧的可执行文件编译的扩展(ouph!)。 在这种情况下,旧的可执行文件
将获得转发器 DLL 而不是旧的 perl DLL,因此将与新的 perl 链接
动态链接库。 虽然不是直接致命的,但它的行为与新的可执行文件相同。 这比
显式启动旧的可执行文件的全部目的。

· 新的可执行文件加载为旧的可执行文件编译的扩展,当旧的 perl
可执行文件正在运行。 在这种情况下,分机将不会接听货运代理 -
与致命的结果。

有了对“LIBPATHSTRICT”的支持,这可能会被规避 - 除非启动了 DLL 之一
. 来自“LIBPATH”(我不知道“LIBPATHSTRICT”是否影响这种情况)。

备注. 除非较新的内核允许 . 在“BEGINLIBPATH”(旧的不要)中,这个烂摊子不能
被彻底清洗。 (事实证明,截至 2002 年初, . 不被允许,
但是 .\. 是 - 并且具有相同的效果。)

备注. “LIBPATHSTRICT”、“BEGINLIBPATH”和“ENDLIBPATH”不是环境变量,
虽然 CMD.EXE 在“SET ...”行上模拟它们。 从 Perl 可以通过以下方式访问它们
Cwd::extLibpath 和 Cwd::extLibpath_set。

DLL 货运代理
假设旧的 DLL 被命名为 perlE0AC.dll (与 5.005_53 相同),以及新的
版本是 5.6.1。 创建文件 perl5shim.def-领导者 -

库 'perlE0AC' 初始化终止
描述 '@#[email protected]:5.006001#@ Perl module for 5.00553 -> Perl 5.6.1 forwarder'
代码加载
数据加载非共享多个
出口

根据需要修改版本/名称。 跑

perl -wnle "next if 0../EXPORTS/; print qq( \"$1\") if /\"(\w+)\"/" perl5.def >lst

在 Perl 构建目录中(为了使 DLL 更小,将 perl5.def 替换为定义
旧版本 Perl 的文件(如果存在)。

cat perl5shim.def-leader lst >perl5shim.def
gcc -Zomf -Zdll -o perlE0AC.dll perl5shim.def -s -llibperl

(忽略多个“警告 L4085”)。

穿线
从 5.003_01 版开始,perl 已链接到多线程 C RTL DLL。 如果 perl 本身不是
编译多线程启用,所以不会是 perl 的 malloc(). 但是,扩展可能会使用
多线程风险自担。

这是为开箱即用的 XFree86-OS/2 编译“Perl/Tk”以及与 DLL 链接所需要的
对于其他有用的库,通常使用“-Zmt -Zcrtdll”编译。

呼叫 外部 程式
由于流行的需求,perl 外部程序调用已更改 wrt Andreas
凯撒的港口。 If perl 需要调用外部程序 通过 f:/bin/sh.exe
将被调用,或者任何覆盖,请参阅“PERL_SH_DIR”。

因此意味着您需要获取一些副本 sh.exe 以及(我使用 pdksh 中的一个)。 这
F:/箱 以上在构建期间自动设置为正确的值
builder 机器,但在运行时是可覆盖的,

原因: 关于“perl5-porters”的共识是perl应该使用一个不可覆盖的shell
每个平台。 OS/2 的明显选择是 CMD.EXEsh.exe. 使用 perl 构建
本身是不可能的 CMD.EXE 作为外壳,因此我选择了“sh.exe”。 这
确保与来自 *nix 的脚本几乎 100% 兼容。 作为额外的好处
如果您使用支持 DOS 的 pdksh 端口,这在 DOS 下也能正常工作(请参阅“先决条件”)。

缺点: 目前 sh.exe pdksh 的调用外部程序通过 叉子()/exec()
没有 运作 exec() 在 OS/2 上。 exec() 由 EMX 通过异步调用模拟
而调用者等待子完成(假装“pid”没有改变)。
这意味着 1 额外 备份 sh.exe 通过激活 叉子()/exec(),这可能会导致
从系统中获取的一些资源(即使我们不计算所需的额外工作
叉子()ing)。

请注意,当我们不生成时,这是一个较小的问题 sh.exe 除非需要(元字符
成立)。

一个总是可以开始 CMD.EXE 明确通过

系统 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ...

如果您需要使用 CMD.EXE,并且不想手动编辑数千个脚本,
在 p5-p 上提出的长期解决方案是有一个指令

使用 OS2::Cmd;

这将覆盖 系统(), exec()、“``”和“open(,'...|')”。 使用当前的 perl,您可以
仅覆盖 系统(), 读取管道() - “``”的显式版本,也许 exec()。 该
代码将替代单参数调用 系统() 通过“核心::系统('cmd.exe','/ c',
转移)”。

如果你有一些“OS2::Cmd”的工作代码,请将它发送给我,我会将它包含在
分配。 我不需要这样的模块,所以无法测试它。

当前调用外部程序的详细情况参见“启动
Perl 下的 OS/2(和 DOS)程序”。让我们提几个特性:

· 外部脚本可以通过它们的基名来调用。 Perl 将尝试相同的扩展
当处理 -S 命令行开关。

· 以“#!”开头的外部脚本或“extproc”将直接执行,不
通过调用在第一行的其余部分指定的程序来调用 shell。

内存 分配
Perl 使用它自己的 malloc() 在 OS/2 下 - 解释器通常受 malloc 限制以提高速度,
但 perl 不是,因为它的 malloc 是闪电般的。 Perl 内存使用调整基准
表明 Perl 的 malloc 比 EMX 快 5 倍。 我没有令人信服的数据
关于内存占用,但是一个(非常随机的)基准测试表明 Perl 的一个是 5%
更好。

perl的组合 malloc() 严格的 DLL 名称解析会产生一个特殊问题
使用期望返回值的库函数 自由()d 系统的 自由().
为了方便需要调用这些函数的扩展,系统内存分配
添加前缀“emx_”后,函数仍然可用。 (目前只有 DLL perl 有
这,它应该传播到 perl_.exe 不久。)

Threads
可以通过提供“-D usethreads”选项来构建启用线程支持的 perl
配置. 目前 OS/2 对线程的支持非常初步。

最显着的问题:

“COND_WAIT”
可能有竞争条件(但可能不是由于 OS/2 的边缘触发性质
事件信号量)。 (需要重新实现(在链接等待线程方面,
链表存储在每个线程结构中?)?)

操作系统2.c
有几个用于 OS/2 特定函数的静态变量。 (需要移动
到每线程结构,还是序列化?)

请注意,这些问题不应该阻止实验,因为它们具有较低的
影响小程序的概率。

使用 onworks.net 服务在线使用 perlos2


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad




×
广告
❤️在这里购物、预订或购买——免费,有助于保持服务免费。