PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?

Posted

技术标签:

【中文标题】PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?【英文标题】:z/OS MVS and z/OS UNIX Interop in PL/I Program? 【发布时间】:2018-06-08 09:08:53 【问题描述】:

我一直在互联网上的各种资源中四处寻找,但找不到我理解的明确答案,所以我在这里问:

如何从 z/OS MVS 调用 z/OS UNIX 代码?

我知道BPXBATCH PGM ... 可以从 z/OS MVS TSO 调用 z/OS UNIX 程序。

但是我可以这样做吗? G。在 z/OS MVS PL/I 程序中?

我想说的是,

能否将 z/OS MVS PL/I 对象模块和 z/OS UNIX C 对象模块静态链接在一起? (除了不同的编程语言之外,两者之间还有区别吗?) 或者我可以动态链接两者吗?

我的用例是:我有一个 1970 年代的旧 PL/I 库,现在需要进行网络连接。据我了解,网络在 z/OS UNIX 世界中会顺利进行。

旧的 PL/I 库与我无法直接影响的多个其他软件静态链接。

P.S.:有更多声誉的人可以建立一个*** PLI标签吗? ;-)

【问题讨论】:

您在使用 IBM Enterprise PL/I 吗? 嗯,有点。 我想说:我记得它是 IBM Enterprise PL/I V4。我只是在使用它,我不是专家。 【参考方案1】:

IBM 语言环境 (LE) 运行时的一个目的是使 COBOL、PL/I、汇编程序和 FORTRAN 可互操作。 C 和 C++ 后来出现了。

生成不符合 LE 的代码的编译器不能很好地相互配合(如果你小心的话,你可以让所有的玩家一起工作)。生成符合 LE 的代码的编译器确实可以很好地相互配合。我编写了使用 C 运行时例程(fopen、fseek、fread、fclose、各种正则表达式例程)的 COBOL 代码,并且由于 LE 运行良好。

您对我关于您是否使用 IBM Enterprise PL/I 的问题的“嗯,有点”的回答可能表明您已经处于不受支持的配置中。

如果您的运行时是 LE,您应该可以调用 IBM 提供的 C 运行时例程。如果您的运行时包含一些旧的不受支持的 OS PL/I 例程,您可能能够调用 IBM 提供的 C 运行时例程来工作——但在那种情况下我不会'睡得香。如果您可以重新链接旧代码以使用旧 OS PL/I 运行时例程的 LE 版本,您可能会发现自己处于更坚实的基础。

【讨论】:

感谢您的回复。我们已经静态链接了来自不同语言(COBOL、PL/I、Assembler)的对象模块。在我看来,你错过了这个话题。我的问题是:我可以混合使用 z/OS UNIX 对象模块吗?或者那没关系? @fjf2002 如果您的意思是“我可以调用设计为通过 z/Unix 命令行编译的模块”,那么可以,但需要注意您提供的先决条件。如果您的意思是“如果我将 curl 和 nslookup 等模块静态链接到我现有的代码中,我可以调用它们吗”那么可能不会。 好吧,让我们看看我是否明白。我试着改写一下: (1) 我登录到 z/OS UNIX 并编译一些 C 代码对象模块。然后我登录到 ISPF,编译一些 1970 年代的 PL/I 模块,然后静态链接到 UNIX C 模块,它会工作吗? (2) 如果这是正确的,什么会阻止我链接 libcurl 库或其他 z/OS UNIX 库? (3)动态链接呢,还有其他情况吗,cf。我的第一篇文章? (4) 我不知道你说的先决条件是什么?【参考方案2】:

关于 z/OS 和 UNIX 服务之间的关系有很多混淆,但要记住的是,这不是两个截然不同的东西......几乎任何任务都可以成为 UNIX 进程并进行 USS 函数调用, 通过适当的设置。

所以你的问题真的是两个问题合二为一:

    如何将我的任务称为 UNIX 进程,以便发出 USS 内核函数? 我的 PL/I 编译器是否与 LE 运行时以及具有使用其他 LE 语言构建的代码的对象库兼容?

第一部分 - 如何让您的进程被称为 UNIX 进程 - 非常简单。 IBM 的方法要求您在调用 UNIX 函数之前连接到 USS 内核(OMVS 地址空间),但通常这会在您第一次调用 USS 函数时自动发生。

在使用 USS 之前,您确实需要进行一定的系统设置。当然,OMVS 本身必须是活跃的(尽管现在没有它是罕见的)。您的安全管理员需要给您一个 UID 号,并可能为您创建一个主目录。假设这部分没问题,您需要做的就是调用一个 USS 函数,现在您是一个 UNIX 服务进程。

几乎任何应用程序都可以调用 IBM 的 USS 可调用服务(即名称以 BPX1/BPX4 开头的所有模块)——所需要的只是支持标准操作系统链接的东西。事实上,这几乎就是 IBM 的运行时库所做的。一个很好的测试是调用 BPX1GPI(即 UNIX“getpid()”)...它返回您的 UNIX 进程 ID,如果您可以使其正常工作,那么您可以使用大多数其他 UNIX 服务。如果您要跟踪 LE “getpid()” 实现,您会发现它只不过是 BPX1GPI 上的一个薄层,因此您没有理由不能自己调用​​底层函数……这适用于大多数USS 内核函数,而不仅仅是 getpid(),所以如果你不知道如何打开一个套接字,调用 BPX1SOC 总是一个很好的“计划 B”。

请记住,作为 UNIX 进程和在 bash shell 之类的东西下运行是有区别的...shell 会执行诸如设置 STDIN/OUT/ERR 等操作 - 如果您需要这些东西,您将如果您只是突然连接到 USS,则需要自己执行此操作。在设置标准文件描述符之前,您不能调用诸如 printf() 之类的东西。

一种简单的入门方法可能是为自己编写一个作为 UNIX 进程运行的简短 C 程序,设置 STDIN/OUT/ERR(以及您需要的任何其他内容),然后调用您当前的 PL/I 程序。这以一种设置您需要的任何 USS 项目的方式“包装”您当前的代码,而无需在 PL/I 中执行任何此操作。您可能还会发现这是一种方便的方法来完成一些在 PL/I 中具有挑战性的事情,例如调用 DLL 函数……只需编写一个简短的 C 函数来执行您需要的操作,然后从您的 PL/我编码。

至于您问题的第二部分,如果您的 PL/I 使用 LE 运行时(除非它很旧,否则它将使用),那么混合来自其他库的代码比听起来要简单得多。至于核心运行时的东西,在大多数情况下,LE 运行时函数足够智能,可以“双模式”,因为相同的运行时函数可以在 USS 进程和非 USS 进程中工作。对象代码就是对象代码,(比如说)打开的 z/OS 文件和打开的 UNIX 服务文件之间的区别只不过是运行时调用 SVC 19(对于 z/OS OPEN)还是 BPX1OPN(对于 UNIX 服务文件)。这只是意味着,一旦您的代码被称为 USS 进程,您几乎可以将 z/OS 和 USS 函数按照您认为合适的方式混合使用。

这也意味着你没有理由不能在 PL/I 程序中使用诸如“libxyz.a”之类的东西,假设在 LE 级别没有不兼容性等等。让活页夹以您期望的方式解决所有问题可能是一个挑战,但如果您坚持下去,它应该会奏效。

PL/I 会有一些困难的事情(我很抱歉 - 我不是 PL/I 专家)。一个示例可能会调用类似于您的 libcurl 示例,其中库是 DLL 而不是静态存档。同样,这里的技巧可能是使用可以从 PL/I 调用的简短 C“存根”,并且该代码可以执行加载和调用 DLL 所需的魔法。否则,我想一旦你把所有的部分放在一起,你会发现这是一个非常简单的练习。

【讨论】:

禁止从 PL/I 直接调用 C-library-functions 的部分是,在 LE PL/I-C-ILC 中,C 程序必须定义一个从 PL/I 调用的条目(#pragma linkage(myentry,PLI)) - 库函数不提供。 好点 - 更有理由在 PLI 代码周围使用“C”存根...例如,PL/我将此包装器称为“my_printf()”,并且可以编译包装器函数使用您提到的#pragma 并调用标准运行时“printf()”函数(或其他)。 Valerie,想联系你,请你看看我的 Meta 帖子“Merge/cleanup tags [zos], [mvs], [zseries], and [mainframe]”,并以比我更了解这些标签的人的身份发表评论吗?【参考方案3】:

只回答问题的“C 和 PL/I 对象的静态链接”部分。

来自 C 或 PL/I 的编译对象只是编译对象。 在哪里编译它们(TSO 或 USS)没有区别;它们所在的位置(PDS/PDSE 或 HFS 目录)也没有区别。

事实上,您可以轻松地从 HFS(例如 hello.o)复制到 PDS。

cp hello.o "//'MYHLQ.OBJ(HELLO)'"

甚至在 USS 编译并将 .o 输出到 PDS

c89 -c hello.c -o "//'MYHLQ.OBJ(HELLO)'"

然后使用 BINDER 链接(或者反过来,将 OBJECT 从 PDS 复制到 HFS,然后使用 ld 链接)

但是,有 2 种目标文件格式,XOBJ 和 GOFF。

GOFF 是较新的格式,如果您使用 XPLINK,它是一个先决条件。 z/OS 上的 64 位 LE 程序也需要 XPLINK。 GOFF 本身也预先要求 PDS/E。

【讨论】:

以上是关于PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?的主要内容,如果未能解决你的问题,请参考以下文章

z/OS 中的 BPXBATCH 实用程序 - 执行 jar 文件

DB for z/OS 中的递归查询

如何在 z/OS 上将 java 作为作业步骤运行

识别环境、z/OS UNIX 与 JCL 或 TSO

自学 Z/OS 汇编程序 [关闭]

DB2 v8 for z/OS 中的交叉连接