有没有办法确定从我的运行z / os汇编程序加载的数据集?如果可能的话,整个steplib连接会很好,但不是必需的。
答案 0 :(得分:3)
我认为你的意思是在你的软件中运行时 - 事实上从系统转储中很容易做到。
最短路径通常是BLDL ...它会搜索steplib,lnklst等,并返回一个目录条目,并指示是否在steplib中找到该模块。现在您的挑战只是将BLDL输出目录条目转换为数据集名称。
如果您的模块来自STEPLIB,那么BLDL输出的第一个字节包含一个串联号......有了这些信息,您就可以找到任务的TIOT(PSATOLD-> TCBTIO),然后是TIOENTRY for STEPLIB,然后通过串联编号索引到此数组。现在,您在TIOENTRY中查找包含模块的特定STEPLIB并置数据集,您只需选择JFCB地址(或SWA令牌)并瞧 - 您的数据集名称。
请注意,STEPLIB实际上不必是" STEPLIB" ...您几乎可以使用任何您想要的DDNAME。 TSO这样做 - 动态分配加载库,这为您提供了SYS *的DDNAMES。这有时被称为" tasklib"它也提出了一些挑战。
从LNKLST,LPA,MLPA等加载的模块的细节不同。但是相同的基本概念。
另请注意,此方法并非100%防弹,因为它并不能真正告诉您模块的来源......相反,它会告诉您现在的位置,这可能并不总是相同的事情(例如,想象某人在你的STEPLIB连接中将你的程序的新副本链接到你的数据集之前......你是从#34; A"加载的,但是这种方法可能会告诉你" B")。
如果您的可执行文件恰好是UNIX路径名,那么该任务实际上更简单一些,因为CSVQUERY会告诉您您想要的内容。实际上,您可能希望在BLDL前面加上对CSVQUERY的调用,以获取入口点名称等信息。
复杂的子系统(CICS浮现在脑海中)在管理程序时可能会做一些奇怪的事情,因此一旦您离开批处理或TSO环境,这些技术可能无法正常工作。最好的办法是让你自己一个转储,并使用IPCS走一些这些链,直到它变得清楚如何做你想要的...一旦你弄清楚什么指向什么,代码就不那么多了。
祝你好运!