【问题标题】:IBM COBOL on AIX file accessIBM COBOL on AIX 文件访问
【发布时间】:2020-08-26 18:18:26
【问题描述】:

我们正在将一堆 COBOL 程序从 z/OS 迁移到 AIX 7。我们在 AIX 上使用 IBM COBOL Compiler (5.1)。现在我不明白 AIX 上 COBOL 的文件访问和文件系统是如何工作的。 COBOL 代码直接用

SELECT  :FILE:    ASSIGN       TO  :FILE:
                              ORGANIZATION IS  SEQUENTIAL
                              ACCESS  MODE IS  SEQUENTIAL
                              STATUS       IS  S-STATUS.

然后做一个OPEN INPUT

这在 AIX 上编译得很好:

PP 5724-Z87 IBM COBOL for AIX  5.1.0 in progress ...
LineID  Message code  Message text
    91  IGYGR1216-I   A "RECORDING MODE" of "F" was assumed for file           
                      "CUSTOMERS".                                              
    94  IGYGR1216-I   A "RECORDING MODE" of "F" was assumed for file           
                      "LIST1".                                              
    97  IGYGR1216-I   A "RECORDING MODE" of "F" was assumed for file "UINPUT". 
Messages    Total    Informational    Warning    Error    Severe    Terminating
Printed:       3           3                                               
End of compilation 1,  program xxxxx,  highest severity: Informational.

现在的问题是,运行程序时找不到文件。它给出状态码:37

我知道我必须为 shell (ksh) 上的文件提供一个文件系统,例如: export CUSTOMERS="STL-CUSTOMERS"。该文件与程序位于同一目录中。

我的问题是:使用哪个文件系统?我尝试了“STL”,它在我看来就像“标准”AIX 文件系统(即 JFS2)。但这不起作用。另一个选项是(来自 AIX 编程指南 5.1 上的 COBOL):

  • DB2
  • SdU(SMARTdata 实用程序)
  • SFS(Encina 结构化文件服务器)
  • STL(标准语言)
  • QSAM(排队顺序访问方法)
  • RSD(记录顺序分隔)

我们尝试了所有方法,并且工作的文件系统是“QSAM”。该文件是从大型机传输的文本文件 (ASCII)。但不是直接的,它首先通过 FTP 复制,然后在 Windows 上转换为 ASCII(我们必须修复换行符)。在玩弄它以使其工作时,我们使用 vi 编辑文件以使每行 80 个字符。所以它是在 AIX 上编辑的,在 AIX 上看起来就像一个普通的文本文件。 为什么 COBOL 仍然希望 QSAM 作为“文件系统”?术语“文件系统”在这里是什么意思?好像不是真正意义上的JFS这样的文件系统。

【问题讨论】:

  • 程序员指南中有很多信息 - 对我来说太多了。你经历过吗?
  • 是的,我经历了它,但无法理解它。它对 QSAM 说:“QSAM(排队顺序访问方法)文件系统支持固定、可变和跨区记录。使用 QSAM 文件系统,您可以直接访问从大型机传输到 AIX 的 QSAM 文件。”没有真正回答为什么这会起作用而 STL 不会。所有的编程指南都是关于大型机的,而不是像 AIX 这样的 Unix 系统。
  • 您确实阅读了与 AIX 相关的程序员指南,不是吗?听起来你读的是 zOS 版本。我用“cobol aix 文档”进行了谷歌搜索,这是导致文档的第一次点击。
  • 是的,我确实阅读了 AIX 程序员指南。听起来确实像 zOS,这就是问题所在。

标签: file aix cobol


【解决方案1】:

我知道这会让人感到困惑......尤其是来自非 POSIX 环境。

我将从答案开始,然后提供更多信息。

对于普通文本文件,您需要 RSD,并确保 \n 是第 81 列。 80 的记录长度只是数据部分,不包括分隔符。 QSAM(固定长度)似乎可以工作,但会将 \n 作为数据的一部分返回!

您的 FS=37 意味着文件的属性与程序要求的不匹配(比 FS=39 更深奥 - 无效的固定属性)。在这种情况下,这意味着您要打开的文件实际上不是 STL 文件。

我们所说的文件系统是指数据在磁盘、SSD、RAM 上的物理存储方式……更准确地说,是在将记录移交给下一个较低级别的 I/O 之前我们如何格式化记录。

文件系统有两种基本类型:

  • 本机(在 JFS2、JFS、NFS、CIFS、...之上)RSD、QSAM、LSQ、STL、SdU。这些文件系统可以由标准操作系统实用程序操作

  • 非本机(在另一个产品之上)DB2 (DB2) 和 SFS (TxSeries/CICS)。这些文件系统对标准操作系统实用程序是不可见的

然后,按 COBOL 组织类型进行分组(首选):

  • 顺序:所有文件系统都支持顺序...z/OS:QSAM、VSAM
  • 相对:STL、SdU、SFS、DB2............z/OS:VSAM
  • 索引:STL、SdU、SFS、DB2............z/OS:VSAM

在 Native 文件系统中,QSAM(variable)、STL 和 SDU 包含元数据,使得它们在 vi、cat、... .

QSAM 是 z/OS 的忠实实现:

  • 固定长度记录:原始数据,无 BDW/RDW,无行分隔符 (\n)。
  • 可变长度记录:RDW + 原始数据(无 \n)...但是没有 BDW。

RSD 是普通的流(文本)文件;每条记录都以 \n 结尾,它计入记录长度(程序永远不会看到它们)。

LSQ(行顺序)与 z/OS 上的相同 - 语义混乱。

VSAM 是提供 z/OS VSAM 的所有功能的文件系统的别名。 不幸的是,由于历史原因,它指向 SdU...

STL远远超过,在所有方面都比 SdU 更好。

SdU 是第一个涵盖 QSAM 和 VSAM 的文件系统,但与 STL 相比,它又旧又破旧。

【讨论】:

  • 感谢您的回答,它确实让一些事情更清楚了。来自 Java 和 Python 背景,这真的很奇怪。所以我在COBOL程序中放了一些关于数据结构的信息,但是部分结构信息在程序外部的“文件系统”中?
  • 我很困惑..我不是 COBOL 程序员(自 80 年代初......即在 COBOL 78 广泛应用于该领域之前。)......COBOL 有一个32 多年来我见过的最丰富的 I/O 功能集!作为程序员,对您来说重要的部分是描述数据布局...您选择的文件系统可能会添加额外的元数据,但应该对您的程序不可见(但可能对您可见) , 如果你使用 vi、cat 等)
  • 说了这么多,我am L3/dev for COBOL on Workstation...所以我会给你一个答案:-)
猜你喜欢
  • 2014-08-09
  • 2018-09-17
  • 2012-10-10
  • 2014-12-30
  • 2010-10-26
  • 2018-03-11
  • 2013-10-04
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多