HP OpenVMS Systems Documentation

Content starts here

OpenVMS 用户手册


前页 目录 索引

11.10 建立逻辑名表

CREATE/NAME_TABLE 命令建立一个逻辑名表,并把它编目到一个目录逻辑名表中。标识逻辑名表或者迭代翻译成逻辑名表的逻辑名必须总是进入到一个目录逻辑名表。

11.10.1 建立进程专用的逻辑名表

要建立一个进程专用的逻辑名表,把这个表建立在 LNM$PROCESS_DIRECTORY 中 (默认)。

目录表中的名称可以包含 1 至 31 个字符。只有大写字母数字字符、美元符 ($) 和下划线 (_) 是有效的。如果指定小写字母的表名,它将自动转换为大写字母。

以下例子建立一个进程专用的逻辑名表 TAX,把逻辑名 CREDIT 的定义放入这个表,并验证该表的建立。SHOW LOGICAL/TABLE 命令允许指定逻辑名表显示出来。


$ CREATE/NAME_TABLE TAX
$ DEFINE/TABLE=TAX CREDIT [ACCOUNTS.CURRENT]CREDIT.DAT
$ SHOW LOGICAL/TABLE=TAX CREDIT
 "CREDIT" = "[ACCOUNTS.CURRENT]CREDIT.DAT"  (TAX)

要使系统在文件查寻时自动搜索新表,可以重新定义 LNM$PROCESS,如以下例子所示:


$ DEFINE/TABLE=LNM$PROCESS_DIRECTORY LNM$PROCESS LNM$PROCESS_TABLE, TAX

11.10.2 建立可共享的逻辑名表

要建立一个可共享的逻辑名表,使用 /PARENT_TABLE 限定词并指定可共享的表名。例如:


$ CREATE/NAME_TABLE/PARENT_TABLE=LNM$SYSTEM_DIRECTORY NEWTAB

11.10.3 建立簇范围逻辑名表

用建立其他可共享逻辑名表的同样方法,可以建立一个簇范围逻辑名表。簇范围逻辑名表是一类特殊的可共享逻辑名表,并服从应用于所有可共享逻辑名表的特权和存取需求 (请参阅 11.10.4 节)。

以下例子展示如何建立一个簇范围逻辑名表:


$ CREATE/NAME_TABLE/PARENT_TABLE=LNM$CLUSTER_TABLE -
_$ new_clusterwide_logical_name_table

要建立将驻留在新的簇范围逻辑名表中的簇范围逻辑名,使用 DEFINE 命令定义新的簇范围逻辑名,并用 /TABLE 限定词指定这个新表的名称,如以下例子所示:


$ DEFINE/TABLE=new_clusterwide_logical_name_table
logical_name -
_$ equivalence_string

11.10.4 特权和存取需求

特权用户可以建立特殊用途的可共享逻辑名表。例如,一个应用程序可以建立一个或多个可共享的逻辑名表传达信息 (如文件位置) 给应用程序的用户:


$ CREATE/NAME_TABLE APPX_FILE_LOCATOR /PARENT=LNM$SYSTEM_DIRECTORY -
_$ /PROTECTION = (S:RWD,O:RWD,G:R,W:R)

要建立一个可共享的逻辑名表,必须具有:

  • 表的 CREATE (C) 存取权
  • 对 LNM$SYSTEM_DIRECTORY 的 SYSPRV 特权或 WRITE (W) 存取权

要删除一个可共享逻辑名表,必须具有:

  • 对该表的 DELETE (D) 存取权
  • 对 LNM$SYSTEM_DIRECTORY 的 SYSPRV 特权或 WRITE (W) 存取权

11.10.5 修改默认保护

操作系统为它建立的和用户建立的可共享逻辑名表提供默认保护。默认保护存储在系统管理员或表拥有者可以修改的安全简要中。有关详情,请参阅 OpenVMS Guide to System Security

您可以修改您建立的表的默认保护:

  • 使用 DCL CREATE/NAME_TABLE 命令的 /PROTECTION 限定词。这个命令让您设置基于 UIC 的保护。
  • 对已经用 ACL 编辑程序或用 SET SECURITY/ACL/OBJECT_TYPE=LOGICAL_NAME_TABLE 命令建立的表,应用 ACL 保护。

可共享逻辑名表的 ACL 在系统引导之间不保存。每次系统引导时,必须重新建立这些逻辑名表的 ACL。

有关对可共享逻辑名表应用 ACL 保护的详情,请参阅 OpenVMS DCL Dictionary 的 SET SECURITY/ACL 命令。

11.10.6 建立逻辑名表的定额

定额用来限制一个给定逻辑名表可以消耗的系统资源数量。进程、组和系统逻辑名表有无限定额。按照默认,当建立一个逻辑名表时,它也有一个无限定额。

您可以指定一个定额限制您建立的逻辑名表的大小,以字节为单位。在建立一个逻辑名之前,要根据这个表的剩余定额检查其数据结构的大小。如果没有足够定额用于新条目,那么系统显示一条出错消息。

一旦为一个表设置了定额,就不能更改它。如果这个表的空间用完了,就使用 DEASSIGN 命令删除旧的逻辑名。这将为新逻辑名释放空间。

在以下例子中,建立逻辑名表 ABC,并给出 500 字节的定额:


$ CREATE/NAME_TABLE/QUOTA=500 ABC

11.10.6.1 设置作业表定额

作业逻辑名表是一个可共享表。建立该表时,就确定这个作业逻辑名表的定额。其定额由以下一个或多个准则确定:

  • 在系统用户授权文件 SYSUAF.DAT 中为用户建立的 JTQUOTA 值 (如果被进程激活的第一个映象是系统映象 LOGINOUT)。
  • 在调用 Create Process ($CREPRC) 系统服务中指定的 PQL$_JTQUOTA 定额列表值。
  • 在用来建立分离进程的 RUN 命令上指定的 /JOB_TABLE_QUOTA 限定词值。
  • SYSGEN 参数 PQL_DJTQUOTA (如果没有应用前缀条件)。这个参数的标准默认值是 1024 字节;然而,系统管理员可以更改它。System Generation 公用程序 (SYSGEN) 可以用来显示和设置参数 PQL_DJTQUOTA (默认作业逻辑名表定额) 和 PQL_MJTQUOTA (最小作业逻辑名表定额) 的值。

作业逻辑名表定额值为 0,意味着没有定额。为了实用,这个定额是无限的。

11.11 修改逻辑名的翻译次序

LNM$FILE_DEV 定义将要搜索的逻辑名表和所有逻辑名翻译的搜索次序。一般,不需要修改默认搜索次序。然而,您可能想要添加新的、进程专用的逻辑名表的名称,使之在用 LNM$FILE_DEV 指定的表之前首先搜索。同样,系统管理员可能想要添加一个或多个可共享逻辑名表的名称,使之在用 LNM$FILE_DEV 指定的表之前首先搜索。

要用一个逻辑名新表建立 LNM$FILE_DEV 进程专用定义,使之首先被系统搜索,执行以下步骤:

  1. 建立一个包含新逻辑名的文件。
  2. 把这个新文件转换为一个新逻辑名表。
  3. 把这个进程逻辑名目录表指定为其父表,建立 LNM$FILE_DEV 专用定义 。
  4. 把新逻辑名表的名称添加到 LNM$FILE_DEV 专用定义中 表名列表的开始。

在以下例子中,建立一个新逻辑名表 NEWTAB,然后使用 NEWTAB 建立 LNM$FILE_DEV 进程专用定义,并将其列为搜索的第一个表:


$ CREATE/NAME_TABLE NEWTAB
$ DEFINE/TABLE=LNM$PROCESS_DIRECTORY LNM$FILE_DEV -
_$ NEWTAB, LNM$PROCESS, LNM$JOB, LNM$GROUP, LNM$SYSTEM

在上面这个例子中,基于以下原因,系统首先搜索 NEWTAB:

  • 使用 LNM$FILE_DEV 进程专用定义代替默认系统版本。
  • 在 LNM$FILE_DEV 之内,NEWTAB 在其他逻辑名表之前列出。

要把一个新逻辑名表添加到 LNM$FILE_DEV 系统定义中,必须有 SYSNAM 或 SYSPRV 特权。

以下例子类似上一个,只是 NEWTAB 被建立为一个可共享表,而不是一个进程专用表:


$ CREATE/NAME_TABLE/PARENT=LNM$SYSTEM_DIRECTORY NEWTAB
$ DEFINE/TABLE=LNM$SYSTEM_DIRECTORY LNM$FILE_DEV -
_$ NEWTAB, LNM$PROCESS, LNM$JOB, LNM$GROUP, LNM$SYSTEM

您也可以从 LNM$FILE_DEV 定义的搜索列表中除去逻辑名表。在以下例子中,建立 LNM$FILE_DEV 进程专用定义,并且只包含进程和系统逻辑名表。由于进程专用的定义不包含 LNM$JOB 和 LNM$GROUP, 因此需要翻译逻辑名的后续命令将不搜索作业或组表。


$ DEFINE/TABLE=LNM$PROCESS_DIRECTORY -
_$ LNM$FILE_DEV LNM$PROCESS,LNM$SYSTEM

11.12 删除逻辑名表

要删除一个逻辑名表,指定包含它的表 (系统或进程目录逻辑名表) 和表名。删除一个父逻辑名表时,将删除在后代表 (和后代表自己) 中的所有逻辑名。

要删除一个可共享逻辑名表,必须拥有对表的 DELETE 存取权或 SYSPRV 特权。

在以下例子中,这个命令删除逻辑名 WORKFILE:


$ DEASSIGN WORKFILE

在以下例子中,这个命令从进程目录表中删除逻辑名表 TAX:


$ DEASSIGN/TABLE=LNM$PROCESS_DIRECTORY TAX

11.13 与进程并存的逻辑名

注册时,DCL 建立与进程并存的逻辑名。这些名称在进程的生存期保持定义。不能解除这些逻辑名的赋值。可以重新定义它们 (在 DEFINE 命令中指定一个不同的等价串),但是如果重新定义的名称以后被解除赋值,那么与进程并存的名称就会重新建立。

以下与进程并存的逻辑名是可提供的:

  • SYS$INPUT
    引用默认输入设备或文件的逻辑名
  • SYS$OUTPUT
    引用默认输出设备或文件的逻辑名
  • SYS$ERROR
    引用系统写入消息的默认设备或文件的逻辑名
  • SYS$COMMAND
    注册时引用 SYS$INPUT 值的逻辑名

11.13.1 在交互和批处理中同等名的差别

交互使用系统时,DCL 把 SYS$INPUT、SYS$OUTPUT、SYS$ERROR 和 SYS$COMMAND 等同于终端。然而,执行命令过程和提交批量作业时,DCL 为这些逻辑名建立新的等价串。

交互执行一个命令过程时,发生以下情况:

  • SYS$INPUT 等同于命令过程。因此,DCL 从命令过程获得数据。这个赋值是临时的。在命令过程终止后,SYS$INPUT 重新获得它的原始值。
  • SYS$OUTPUT、SYS$COMMAND 和 SYS$ERROR 仍然等同于终端。

提交一个批量作业时,发生以下情况:

  • SYS$INPUT 和 SYS$COMMAND 等同于批量作业命令过程。
  • SYS$OUTPUT 和 SYS$ERROR 等同于批量作业日志文件 。

嵌套命令过程时 (即是说,当编写一个执行其他命令过程的命令过程时),SYS$INPUT 的等价串更改为指向当前正在执行的命令过程。然而,SYS$OUTPUT、SYS$ERROR 和 SYS$COMMAND 的等价串保持不变,除非明确地更改它们。

另外,当输入一个打开文件的命令时,DCL 就打开这个文件作为一个与进程并存的文件。例如,如果使用 OPEN 命令打开一个文件,那么这个文件就被打开为一个与进程并存的文件。文件保持打开,直到明确地关闭这个文件,或者直到注销。

与进程并存的文件存储在存储器的特殊区域。注意,如果保持很多文件同时打开,那么可以用尽这个区域。如果发生这种情况,就关闭一些文件 (或者注销)。

11.13.2 使用与进程并存的逻辑名重定向文件 I/O

可以使用与进程并存的逻辑名重定向文件 I/O。在命令过程中,可以使用这些名称从终端读取数据,并且显示数据 (请参阅第 13 章第 14 章)。注意 DCL 忽略 SYS$INPUT 和 SYS$COMMAND 的新定义。

在 OpenVMS V7.1 中,引入了 DCL PIPE 命令。PIPE 命令是重定向文件 I/O 的替代方法。有关 PIPE 命令的详情,请参阅 OpenVMS DCL Dictionary: N--Z

11.13.2.1 重定义 SYS$INPUT

您可以重新定义 SYS$INPUT,以便一个由命令过程调用的映象可以从终端或另一个文件读取输入。由于 DCL 总是从默认输入流获得输入,因此 DCL 忽略 SYS$INPUT 的重新定义。

在以下例子中,所列命令是新命令过程文件的一部分。DEFINE 命令把 SYS$INPUT 重新定义为 SYS$COMMAND。注册时,SYS$COMMAND 引用终端作为初始输入流。通过这个新定义,命令过程调用的映象从终端获得输入,而不是从命令过程文件 (默认),但是这只用于一段时间。

/USER_MODE 限定词告诉命令过程,只为下一个映象重新定义 SYS$INPUT。在这个例子中,下一个映象是编辑程序。当这个编辑程序完成时,SYS$INPUT 就恢复它的默认值。在这种情况下,其默认值是命令过程文件。


$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND
$ EDIT/TPU MYFILE.DAT
   .
   .
   .

11.13.2.2 重定义 SYS$OUTPUT

您可以重新定义 SYS$OUTPUT 把输出从默认设备重定向到另一个文件。当重新定义 SYS$OUTPUT 时,系统用这个逻辑名赋值指定的名称打开文件。当定义 SYS$OUTPUT 时,所有后续输出被指引到这个新文件。

记住要解除 SYS$OUTPUT 赋值。否则,输出将继续写入指定的文件。注意,可以按用户模式 (用 DEFINE/USER_MODE) 重新定义 SYS$OUTPUT 来重定向映象的输出。只有当执行下一个命令映象时,这个定义才是有效的。一旦执行完这个命令映象 (即,其输出被俘获到一个文件),逻辑名 SYS$OUTPUT 就恢复为它的默认值。

您注册时,系统建立两个称为 SYS$OUTPUT 的逻辑名。一个名称在执行模式建立;另一个名称在监督程序模式建立。通过重定义 SYS$OUTPUT 可以取代监督程序模式逻辑名。如果解除监督程序模式名赋值,那么系统在监督程序模式重新定义 SYS$OUTPUT,使用执行模式等价串。您不能解除执行模式名赋值。

重新定义 SYS$OUTPUT 为一个文件时,这个逻辑名只包含文件说明的设备部分,即使输出被指引到指定的文件。

重新定义 SYS$OUTPUT 时, 如果系统不能打开指定的文件,它就显示一条出错消息。

在重新定义 SYS$OUTPUT 之后,多数命令把输出指引到这个文件的现有版本。然而,某些命令在写入输出之前会建立这个文件的新版本。

在以下例子中,在输入 SHOW DEVICES 命令之前,SYS$OUTPUT 被定义为 MYFILE.LIS。SHOW DEVICES 产生的显示被指引到当前目录的 MYFILE.LIS,而不是终端。您可以象任何其他文本文件一样处理这个数据:


$ DEFINE SYS$OUTPUT MYFILE.LIS
$ SHOW DEVICES

在以下例子中,SYS$OUTPUT 被重新定义为文件 TEMP.DAT。重新定义 SYS$OUTPUT 时,来自 DCL 和映象的输出被指引到文件 TEMP.DAT。 来自 SHOW LOGICAL 命令和 SHOW TIME 命令的输出也被发送到 TEMP.DAT。当 SYS$OUTPUT 被解除赋值时,系统关闭文件 TEMP.DAT 并把 SYS$OUTPUT 重新定义为终端。当输入 TYPE 命令时,收集在 TEMP.DAT 的输出显示在终端上。


$ DEFINE SYS$OUTPUT TEMP.DAT
$ SHOW LOGICAL SYS$OUTPUT
$ SHOW TIME
$ DEASSIGN SYS$OUTPUT
$ TYPE TEMP.DAT
   "SYS$OUTPUT" = "DISK1:" (LNM$PROCESS_TABLE)
  06-MAY-1996 13:26:53

重新定义 SYS$OUTPUT 时,其等价串包含设备名 DISK1,不是完整文件说明。

11.13.2.3 重定义 SYS$ERROR

您可以重新定义 SYS$ERROR 把出错消息指引到一个指定的文件。然而,如果重新定义 SYS$ERROR,使它不同于 SYS$OUTPUT (或如果重新定义 SYS$OUTPUT 而没有重新定义 SYS$ERROR),那么 DCL 命令就把通知、警告、出错和严重出错消息发送给 SYS$ERROR 和 SYS$OUTPUT。因此,您接收这些消息两次,一次是在 SYS$ERROR 定义指出的文件中,另一次是在 SYS$OUTPUT 指出的文件中。成功消息只发送到 SYS$OUTPUT 指出的文件。

DCL 命令和映象使用标准出错显示机制,把出错消息发送给 SYS$ERROR 和 SYS$OUTPUT,即使 SYS$ERROR 不同于 SYS$OUTPUT。然而,如果重新定义 SYS$ERROR,然后运行一个引用 SYS$ERROR 的映象,那么这个映象只把出错消息发送给 SYS$ERROR 指出的文件。即使 SYS$ERROR 不同于 SYS$OUTPUT,也是如此。

11.13.2.4 重定义 SYS$COMMAND

虽然您可以重新定义 SYS$COMMAND,但 DCL 忽略您的定义。DCL 总是使用初始输入流的默认定义。然而,如果执行一个 SYS$COMMAND 引用的映象,那么这个映象可以使用您的新定义。


前页 后页 目录 索引