open(3tcl) Tcl Built-In Commands open(3tcl)

open - 打开基于文件或命令管道的一个通道

总览 SYNOPSIS

open fileName
open fileName access
open fileName access permissions

描述 DESCRIPTION

这个命令打开一个文件、串行端口、或命令管道并返回一个 通道标识符用于将来被命令如 readputs、和close 调用。如果 fileName 的第一个字符不是“|”则命令打开一个文件: fileName 给出要打开的文件的名字,并且它必须符合在 filename 手册条目中描述的规范。

如果存在 access 参数,则它指示以何种方式访问文件(或命令管道)。在第一种形式下 access 可以是下列值:

为只读而打开文件;文件必须已经存在。如果未指定 access 则这个值是缺省值。
为读写而打开文件;文件必须已经存在。
为只写而打开文件。如果文件已经存在则截断(truncate)它,如果文件不存在则建立一个新文件。
为读写而打开文件。如果文件已经存在则截断(truncate)它,如果文件不存在则建立一个新文件。
为只读而打开文件。如果文件不存在,则建立一个新的空文件。设置初始访问位置为文件的结束处。
为读写而打开文件。如果文件不存在,则建立一个新的空文件。设置初始访问位置为文件的结束处。

在第二种形式下,access 由某些下列标志的一个列表构成,所有这些都有标准的 POSIX 意义。 必须有一个标志是 RDONLYWRONLYRDWR 中的一个。

为只读而打开文件。
为只写而打开文件。
为读写而打开文件。
在每次写之前把指针设置到文件的结束处。
如果文件不存在则建立这个文件(如果没有这个标志,在文件不存在时返回一个错误)。
如果还指定了 CREAT,如果文件已经存在则返回一个错误。
如果文件是一个终端设备,这个标志防止这个文件成为这个进程的控制终端。
在打开文件和可能的后续 I/O
操作期间防止过程阻塞。这个标志的真实行为是依赖于系统的和依赖于设备的;不鼓励使用它(更好是使用 fconfigure 命令来使一个文件进入非阻塞模式)。详情参见你的系统文档中的 open 系统调用的 O_NONBLOCK 标志。
如果文件存在则截断其为零长度。

如果作为打开过程的一部分而建立了一个新文件,使用 permissions (一个整数)并联合进程的文件模式建立掩码为新文件设置权限。Permissions 缺省为 0666。

Note that if you are going to be reading or writing binary data from the channel created by this command, you should use the fconfigure command to change the -translation option of the channel to binary before transferring any binary data. This is in contrast to the ``b'' character passed as part of the equivalent of the access parameter to some versions of the C library fopen() function.

命令管道 COMMAND PIPELINES

如果 fileName is 的第一个字符是“|”,则把 fileName 的余下的字符被作为描述要调用的一个命令管道的参数的一个列表来对待,与 exec 对待参数的方式相同。在这种情况下,依赖于 access 的值,使用由 open 返回的通道标识符来向这个命令的输入管道写或从它的输出管道读。如果使用了只写访问(例如, accessw),则除非被这个命令所屏弃(override),这个(命令)管道的标准输出被定向到当前的标准输出上。如果使用了只读访问(例如,accessr),则除非被这个命令所屏弃(override),这个(命令)管道的标准输入接受当前的标准输入。

译注

打开用来写的命令管道
                    Tcl     ==>   Pipeline  ==>   command
+--------+       +--------+      +--------+      +--------+
| stdin  |<------+ stdin  |  +-->| pipein |   +--+ stdin  |
+--------+       +--------+  |   +--------+   |  +--------+
| stdout |<--+---+ stdout |  |   | pipeout|<--+  | stdout +--+
+--------+   |   +--------+  |   +--------+      +--------+  |
             |   | stderr |  |                   | stderr |  |
             |   +--------+  |                   +--------+  |
             |   | channel+--+                               |
             |   +--------+                                  |
             +-----------------------------------------------+
打开一个用来读的命令管道
             +-----------------------------------------------+
             |                                               |
+--------+   |   +--------+      +--------+      +--------+  |
| stdin  |<--+---+ stdin  |      | pipein |<--+  | stdin  +--+
+--------+       +--------+      +--------+   |  +--------+
| stdout |<------+ stdout |  +-->| pipeout|   +--+ stdout |
+--------+       +--------+  |   +--------+      +--------+
                 | stderr |  |                   | stderr |
                 +--------+  |                   +--------+
                 | channel+--+
                 +--------+
                    Tcl     <==    Pipeline  <==  command

串行通信 SERIAL COMMUNICATIONS

如果 fileName 参照一个串行端口,则打开特定的串行端口并以依赖于平台的方式初始化。给 fileName 用以打开一个串行端口的可接受的值在移植要点中描述。

配置选项 CONFIGURATION OPTIONS

使用 fconfigure 命令来为打开的串行端口查询和设置下列选项:

这个选项是由逗号分隔的四个值的一个集合: 这个串行端口的波特(baud)率、奇偶校验(parity)、数据位数、和停止位。baud 率是指定连接速度的一个简单整数。Parity 是下列字母之一: noems;分别表示奇偶校验选项“none”、“odd”、“even”、“mark”、或“space”。Data 是数据位数,应当是从 5 到 8 中的一个整数,而 stop 是停止位的数目,应当是整数 1 或 2。
只在 Windows 上串行端口能获得这个选项,它被用来设置文件事件轮询(poll)之间的最大时间。这影响整个 Tcl 解释器检查事件中间的时间间隔(总是采用最小的值)。只有在你想要使轮询这个串行端口的时间间隔小于 10 msec (缺省值)时才使用这个选项。
只在 Windows 上串行端口能获得这个选项,并只能查询(只在直接请求时报告)。在串行通信出错的情况下,readputs 返回一个一般 Tcl 文件 I/O 错误。可以调用 fconfigure -lasterror 来得到错误详情的一个列表(例如,FRAME RXOVER)。

移植要点 PORTABILITY ISSUES

fileName 来打开一个串行端口的有效值的形式是 comX:,这里 X 是一个数,一般是从 1 到 4。如果系统有多于四个串行端口,则这个符号(notation)可以表示串行端口从 1 到 9。尝试打开一个不存在或序号大于 9 的串行端口将导致错误。打开串行端口的可替代的方法是使用文件名 \\.\comX,这里 X 是对应于一个串行端口的任何(整)数;请注意,这个方法在 Windows 95 和 Windows 98 上相当的慢。
在交互运行 Tcl 的时候,如果存在一个控制台,则在真实的控制台和使用标准输入或输出的一个命令管道之间可能有一些奇怪的相互作用。如果为读而打开一个命令管道,在这个控制台键入的一些行将被发送到命令管道而一些行将别发送到 Tcl 求值器。如果为写而打开一个命令管道,在管道关闭之前,在这个控制台中键入的击键(keystroke)将一直是不可见的。在执行 16-bit 或 32-bit 应用程序时都可能发生这种事情。这些问题只发生在 Tcl 和子应用程序同时竞争这个控制台的时候。如果命令管道是从一个脚本中启动的,所以 Tcl 不访问控制台,或者命令管道不使用标准输出或输出,而是重定向(从或)到一个文件,那么上述问题不发生。
不能同时为读写而打开一个命令管道来执行一个 16-bit DOS 应用程序,因为从一个管道接收标准输入和向一个管道发送标准输出的(两个) 16-bit DOS 应用程序同步运行。不执行 16-bit DOS 应用程序的命令管道异步运行并且可以同时为读写而打开。

在交互运行 Tcl 的时候,如果存在一个控制台,则在真实的控制台和使用标准输入或输出的一个命令管道之间可能有一些奇怪的相互作用。如果为从一个 32-bit 应用程序读而打开一个命令管道,在这个控制台键入的一些击键将被发送到命令管道而一些击键将别发送到 Tcl 求值器。如果为向一个 32-bit 应用程序写而打开一个命令管道,在管道关闭之前,在控制台中将一直没有输出是可见的。这些问题只发生在 Tcl 和子应用程序同时竞争这个控制台的时候。如果命令管道是从一个脚本中启动的,所以 Tcl 不访问控制台,或者命令管道不使用标准输出或输出,而是重定向(从或)到一个文件,那么上述问题不发生。

不论 Tcl 是否在交互的运行,如果为从一个 16-bit DOS 应用程序读而打开一个命令管道,在从命令管道的标准输出收到文件结束之前,对 open 的调用一直不返回。如果为向一个 16-bit DOS 应用程序写而打开一个命令管道,在管道实际上被关闭之前,没有数据被发送到命令管道的标准输出。象上面描述的那样,这个问题发生的原因是 16-bit DOS 应用程序同步运行。

在 Macintosh 下目前未实现打开串行端口。

在 Macintosh 不支持打开命令管道,原因是应用程序不支持标准输入或输出的概念。

fileName 来打开一个串行端口的有效值的形式是 /dev/ttyX,这里的 Xab,但是可以使用映射到一个串行端口的任何伪文件(pseudo-file)的名字。

在交互运行 Tcl 的时候,如果存在一个控制台,则在真实的控制台和使用标准输入或输出的一个命令管道之间可能有一些奇怪的相互作用。如果为读而打开一个命令管道,在这个控制台键入的一些行将被发送到命令管道而一些行将别发送到 Tcl 求值器。这些问题只发生在 Tcl 和子应用程序同时竞争这个控制台的时候。如果命令管道是从一个脚本中启动的,所以 Tcl 不访问控制台,或者命令管道不使用标准输出或输出,而是重定向(从或)到一个文件,那么上述问题不发生。

关于在不同平台上执行应用程序请参见 exec 命令的移植要点章节来得到不特定于命令管道的额外的信息。

参见 SEE ALSO

file(n), close(n), filename(n), fconfigure(n), gets(n), read(n), puts(n), exec(n), fopen(1)

关键字 KEYWORDS

access mode, append, create, file, non-blocking, open, permissions, pipeline, process, serial

寒蝉退士

2001/10/16

《中国 Linux 论坛 man 手册页翻译计划》:

http://cmpp.linuxforum.net

本页面中文版由中文 man 手册页计划提供。
中文 man 手册页计划:https://github.com/man-pages-zh/manpages-zh

7.6 Tcl