File AIX文件访问上的ibmcobol

File AIX文件访问上的ibmcobol,file,aix,cobol,File,Aix,Cobol,我们正在将大量COBOL程序从z/OS迁移到AIX7。我们正在AIX上使用IBMCOBOL编译器(5.1)。现在我不明白AIX上COBOL的文件访问和文件系统是如何工作的。 COBOL代码与 SELECT :FILE: ASSIGN TO :FILE: ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENT

我们正在将大量COBOL程序从z/OS迁移到AIX7。我们正在AIX上使用IBMCOBOL编译器(5.1)。现在我不明白AIX上COBOL的文件访问和文件系统是如何工作的。 COBOL代码与

SELECT  :FILE:    ASSIGN       TO  :FILE:
                              ORGANIZATION IS  SEQUENTIAL
                              ACCESS  MODE IS  SEQUENTIAL
                              STATUS       IS  S-STATUS.
然后进行
打开输入

这在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上的COBOL编程指南》5.1):

  • DB2
  • SdU(智能数据实用程序)
  • 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
在本机文件系统中,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相比,它又旧又旧。

程序员指南中有很多信息,太多了,我看不懂。你经历过了吗?是的,我经历过,但没有太多的意义。它对QSAM说:“QSAM(排队顺序访问方法)文件系统支持固定、可变和跨记录。使用QSAM文件系统,您可以直接访问从大型机传输到AIX的QSAM文件。”但没有真正回答为什么这会起作用,STL也不会起作用。所有的编程指南都是关于大型机的,而不是像AIX这样的Unix系统。您确实阅读了与AIX相关的程序员指南,不是吗?听起来你读过zOS的版本。我在谷歌上搜索了“CobolAIX文档”,这是第一次找到文档。这听起来确实像zOS one,这就是问题所在。谢谢你的回答,它确实让一些事情更清楚了。来自Java和Python的背景,这真的很奇怪。所以我在COBOL程序中放了一些关于数据结构的信息,但是结构信息的一部分在程序外部的“文件系统”中?我感到困惑。。我不是COBOL程序员(从80年代初开始,即COBOL78广泛应用于该领域之前)。。。。COBOL是我32多年来见过的最丰富的I/O函数集之一!作为一名程序员,您最重要的部分是描述数据布局。。。您选择的文件系统可能会添加额外的元数据,但这些元数据对您的程序应该是不可见的(但如果您使用v,则可能对您可见)