Arch manual pages

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


open - 打開基於文件或命令管道的一個通道

open fileName
open fileName access
open fileName access permissions

這個命令打開一個文件、串行端口、或命令管道並返回一個 通道標識符用於將來被命令如 readputs、和close 調用。如果 fileName 的第一個字符不是“|”則命令打開一個文件: fileName 給出要打開的文件的名字,並且它必須符合在 filename 手冊條目中描述的規範。

如果存在 access 參數,則它指示以何種方式訪問文件(或命令管道)。在第一種形式下 access 可以是下列值:

r
爲只讀而打開文件;文件必須已經存在。如果未指定 access 則這個值是缺省值。
r+
爲讀寫而打開文件;文件必須已經存在。
w
爲只寫而打開文件。如果文件已經存在則截斷(truncate)它,如果文件不存在則建立一個新文件。
w+
爲讀寫而打開文件。如果文件已經存在則截斷(truncate)它,如果文件不存在則建立一個新文件。
a
爲只讀而打開文件。如果文件不存在,則建立一個新的空文件。設置初始訪問位置爲文件的結束處。
a+
爲讀寫而打開文件。如果文件不存在,則建立一個新的空文件。設置初始訪問位置爲文件的結束處。

在第二種形式下,access 由某些下列標誌的一個列表構成,所有這些都有標準的 POSIX 意義。 必須有一個標誌是 RDONLYWRONLYRDWR 中的一個。

RDONLY
爲只讀而打開文件。
WRONLY
爲只寫而打開文件。
RDWR
爲讀寫而打開文件。
APPEND
在每次寫之前把指針設置到文件的結束處。
CREAT
如果文件不存在則建立這個文件(如果沒有這個標誌,在文件不存在時返回一個錯誤)。
EXCL
如果還指定了 CREAT,如果文件已經存在則返回一個錯誤。
NOCTTY
如果文件是一個終端設備,這個標誌防止這個文件成爲這個進程的控制終端。
NONBLOCK
在打開文件和可能的後續 I/O 操作期間防止過程阻塞。這個標誌的真實行爲是依賴於系統的和依賴於設備的;不鼓勵使用它(更好是使用 fconfigure 命令來使一個文件進入非阻塞模式)。詳情參見你的系統文檔中的 open 系統調用的 O_NONBLOCK 標誌。
TRUNC
如果文件存在則截斷其爲零長度。

如果作爲打開過程的一部分而建立了一個新文件,使用 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 返回的通道標識符來向這個命令的輸入管道寫或從它的輸出管道讀。如果使用了只寫訪問(例如, 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

如果 fileName 參照一個串行端口,則打開特定的串行端口並以依賴於平臺的方式初始化。給 fileName 用以打開一個串行端口的可接受的值在移植要點中描述。

使用 fconfigure 命令來爲打開的串行端口查詢和設置下列選項:
-mode baud,parity,data,stop
這個選項是由逗號分隔的四個值的一個集合: 這個串行端口的波特(baud)率、奇偶校驗(parity)、數據位數、和停止位。baud 率是指定連接速度的一個簡單整數。Parity 是下列字母之一: noems;分別表示奇偶校驗選項“none”、“odd”、“even”、“mark”、或“space”。Data 是數據位數,應當是從 5 到 8 中的一個整數,而 stop 是停止位的數目,應當是整數 1 或 2。
-pollinterval msec
只在 Windows 上串行端口能獲得這個選項,它被用來設置文件事件輪詢(poll)之間的最大時間。這影響整個 Tcl 解釋器檢查事件中間的時間間隔(總是採用最小的值)。只有在你想要使輪詢這個串行端口的時間間隔小於 10 msec (缺省值)時才使用這個選項。
-lasterror
只在 Windows 上串行端口能獲得這個選項,並只能查詢(只在直接請求時報告)。在串行通信出錯的情況下,readputs 返回一個一般 Tcl 文件 I/O 錯誤。可以調用 fconfigure -lasterror 來得到錯誤詳情的一個列表(例如,FRAME RXOVER)。

Windows (所有版本)
fileName 來打開一個串行端口的有效值的形式是 comX:,這裏 X 是一個數,一般是從 1 到 4。如果系統有多於四個串行端口,則這個符號(notation)可以表示串行端口從 1 到 9。嘗試打開一個不存在或序號大於 9 的串行端口將導致錯誤。打開串行端口的可替代的方法是使用文件名 \\.\comX,這裏 X 是對應於一個串行端口的任何(整)數;請注意,這個方法在 Windows 95 和 Windows 98 上相當的慢。
Windows NT
在交互運行 Tcl 的時候,如果存在一個控制檯,則在真實的控制檯和使用標準輸入或輸出的一個命令管道之間可能有一些奇怪的相互作用。如果爲讀而打開一個命令管道,在這個控制檯鍵入的一些行將被髮送到命令管道而一些行將別發送到 Tcl 求值器。如果爲寫而打開一個命令管道,在管道關閉之前,在這個控制檯中鍵入的擊鍵(keystroke)將一直是不可見的。在執行 16-bit 或 32-bit 應用程序時都可能發生這種事情。這些問題只發生在 Tcl 和子應用程序同時競爭這個控制檯的時候。如果命令管道是從一個腳本中啓動的,所以 Tcl 不訪問控制檯,或者命令管道不使用標準輸出或輸出,而是重定向(從或)到一個文件,那麼上述問題不發生。
Windows 95
不能同時爲讀寫而打開一個命令管道來執行一個 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 下目前未實現打開串行端口。

在 Macintosh 不支持打開命令管道,原因是應用程序不支持標準輸入或輸出的概念。

Unix       
fileName 來打開一個串行端口的有效值的形式是 /dev/ttyX,這裏的 Xab,但是可以使用映射到一個串行端口的任何僞文件(pseudo-file)的名字。

在交互運行 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