fjf*_*002 2 unix mainframe zos mvs pl-i
我一直在寻找互联网上的各种资源,但找不到我理解的确定答案,所以我在这里问:
如何从z/OS MVS调用z/OS UNIX代码?
我知道BPXBATCH PGM ...
可以从z/OS MVS TSO调用z/OS UNIX程序.
但我可以这样做,例如在az/OS MVS PL/I程序中吗?
我想说的是,
我的用例是:我有一个20世纪70年代的旧PL/I库,现在需要进行网络连接.据我所知,网络将在z/OS UNIX世界中顺利进行.
旧的PL/I库静态链接到我无法直接影响的多个其他软件.
PS:有声望更高的人可以建立一个stackoverflow PLI标签吗?;-)
关于 z/OS 和 UNIX 服务之间的关系存在很多混乱,但要记住的是,它们不是两个不同的东西...几乎任何任务都可以成为 UNIX 进程并进行 USS 函数调用,其中正确的设置。
所以你的问题实际上是两个问题合而为一:
第一部分 - 如何将您的进程称为 UNIX 进程 - 非常简单。IBM 的方法要求您先连接到 USS 内核(OMVS 地址空间),然后才能调用 UNIX 函数,但通常这种情况会在您第一次调用 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/I 中调用该函数我编码。
至于问题的第二部分,如果您的 PL/I 使用 LE 运行时(除非它很旧,否则它会使用),那么混合来自其他库的代码比听起来简单得多。至于核心运行时内容,在大多数情况下,LE 运行时函数足够智能,可以是“双模式”,因为相同的运行时函数可以在 USS 进程和非 USS 进程中运行。目标代码就是目标代码,(例如)z/OS 文件打开和 UNIX 服务文件打开之间的区别无非就是运行时是否调用 SVC 19(对于 z/OS OPEN)或 BPX1OPN(对于 UNIX 服务文件)。这仅仅意味着,一旦您的代码被称为 USS 进程,您几乎可以按照您认为合适的方式混合 z/OS 和 USS 函数。
这也意味着假设 LE 级别不存在不兼容性等情况,您没有理由不能在 PL/I 程序中使用“libxyz.a”之类的东西。让活页夹按照您期望的方式解决所有问题可能是一个挑战,但如果您坚持下去,一切都应该可行。
PL/I 中会有一些困难(很抱歉 - 我不是 PL/I 专家)。一个示例可能是调用类似 libcurl 示例的内容,其中库是 DLL 而不是静态存档。同样,这里的技巧可能是使用可以从 PL/I 调用的短 C“存根”,并且该代码可以发挥加载和调用 DLL 所需的魔力。否则,我想一旦你把所有的部分整合在一起,你就会发现这是一个非常简单的练习。
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版本,那么您可能会发现自己处于更加坚实的基础上.
归档时间: |
|
查看次数: |
267 次 |
最近记录: |