open(3tcl) | Tcl Built-In Commands | open(3tcl) |
open - 打开基于文件或命令管道的一个通道
open fileName
open fileName access
open fileName access permissions
这个命令打开一个文件、串行端口、或命令管道并返回一个 通道标识符用于将来被命令如 read、puts、和close 调用。如果 fileName 的第一个字符不是“|”则命令打开一个文件: fileName 给出要打开的文件的名字,并且它必须符合在 filename 手册条目中描述的规范。
如果存在 access 参数,则它指示以何种方式访问文件(或命令管道)。在第一种形式下 access 可以是下列值:
在第二种形式下,access 由某些下列标志的一个列表构成,所有这些都有标准的 POSIX 意义。 必须有一个标志是 RDONLY、WRONLY 或 RDWR 中的一个。
如果作为打开过程的一部分而建立了一个新文件,使用 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.
如果 fileName is 的第一个字符是“|”,则把 fileName 的余下的字符被作为描述要调用的一个命令管道的参数的一个列表来对待,与 exec 对待参数的方式相同。在这种情况下,依赖于 access 的值,使用由 open 返回的通道标识符来向这个命令的输入管道写或从它的输出管道读。如果使用了只写访问(例如, access 是 w),则除非被这个命令所屏弃(override),这个(命令)管道的标准输出被定向到当前的标准输出上。如果使用了只读访问(例如,access 是 r),则除非被这个命令所屏弃(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
如果 fileName 参照一个串行端口,则打开特定的串行端口并以依赖于平台的方式初始化。给 fileName 用以打开一个串行端口的可接受的值在移植要点中描述。
使用 fconfigure 命令来为打开的串行端口查询和设置下列选项:
在交互运行 Tcl 的时候,如果存在一个控制台,则在真实的控制台和使用标准输入或输出的一个命令管道之间可能有一些奇怪的相互作用。如果为从一个 32-bit 应用程序读而打开一个命令管道,在这个控制台键入的一些击键将被发送到命令管道而一些击键将别发送到 Tcl 求值器。如果为向一个 32-bit 应用程序写而打开一个命令管道,在管道关闭之前,在控制台中将一直没有输出是可见的。这些问题只发生在 Tcl 和子应用程序同时竞争这个控制台的时候。如果命令管道是从一个脚本中启动的,所以 Tcl 不访问控制台,或者命令管道不使用标准输出或输出,而是重定向(从或)到一个文件,那么上述问题不发生。
不论 Tcl 是否在交互的运行,如果为从一个 16-bit DOS 应用程序读而打开一个命令管道,在从命令管道的标准输出收到文件结束之前,对 open 的调用一直不返回。如果为向一个 16-bit DOS 应用程序写而打开一个命令管道,在管道实际上被关闭之前,没有数据被发送到命令管道的标准输出。象上面描述的那样,这个问题发生的原因是 16-bit DOS 应用程序同步运行。
在 Macintosh 不支持打开命令管道,原因是应用程序不支持标准输入或输出的概念。
在交互运行 Tcl 的时候,如果存在一个控制台,则在真实的控制台和使用标准输入或输出的一个命令管道之间可能有一些奇怪的相互作用。如果为读而打开一个命令管道,在这个控制台键入的一些行将被发送到命令管道而一些行将别发送到 Tcl 求值器。这些问题只发生在 Tcl 和子应用程序同时竞争这个控制台的时候。如果命令管道是从一个脚本中启动的,所以 Tcl 不访问控制台,或者命令管道不使用标准输出或输出,而是重定向(从或)到一个文件,那么上述问题不发生。
关于在不同平台上执行应用程序请参见 exec 命令的移植要点章节来得到不特定于命令管道的额外的信息。
file(n), close(n), filename(n), fconfigure(n), gets(n), read(n), puts(n), exec(n), fopen(1)
access mode, append, create, file, non-blocking, open, permissions, pipeline, process, serial
寒蝉退士
2001/10/16
http://cmpp.linuxforum.net
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
7.6 | Tcl |