file - IBM COBOL on AIX 文件访问
问题描述
我们正在将一堆 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。
解决方案
我可以看到这会令人困惑......尤其是来自非 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(变量)、STL 和 SDU 包含元数据,使它们在 vi、cat 中无法真正查看,...好吧...您可以在 vi 中打开它们,但它看起来像完全垃圾。
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 相比,它已经过时且陈旧。
推荐阅读
- javascript - 使用 react-chart-js-2 和 reactapp 没有出现 x 轴上的时间
- c# - 在完全笔直的赛道上的比赛时间不一致
- javascript - 在 JavaScript 中根据屏幕大小删除附加元素
- sequelize.js - 管理模型别名
- java - GitHub App Access Tokens API 错误:集成必须生成公钥
- django - 如何将 id 从 django rest 框架返回到 Angular 应用程序
- python - chromedriver 使用 selenium 进行抓取
- html - 更改引导按钮组属性
- google-apps-script - 在 Google 脚本中,如何将 doc url 变量传递到 href 语句中?
- python - TypeError:一元操作数类型错误〜:'float'而groupby并应用函数