______________________________________________________________________________
open − 打 開 基 於 檔 案 或 命 令 管 道 的 一 個 通 道
open
fileName
open fileName access
open fileName access permissions
_________________________________________________________________
這 個 命 令 打 開 一 個 檔 案 、 串 行 端 口 、 或 命 令 管 道 並 返 回 一 個 │ 通 道 標 識 符 用 於 將 來 被 命 令 如 read、 puts、 和 close 調 用 。 如 果 fileName 的 第 一 個 字 符 不 是 「 |」 則 命 令 打 開 一 個 檔 案 : fileName 給 出 要 打 開 的 檔 案 的 名 字 , 並 且 它 必 須 符 合 在 filename 手 冊 條 目 中 描 述 的 規 範 。
如 果 存 在 access 參 數 , 則 它 指 示 以 何 種 方 式 訪 問 檔 案 (或 命 令 管 道 )。 在 第 一 種 形 式 下 access 可 以 是 下 列 值 :
|
r |
為 只 讀 而 打 開 檔 案 ; 檔 案 必 須 已 經 存 在 。 如 果 未 指 定 access 則 這 個 值 是 預 設 值 。 | ||
|
r+ |
為 讀 寫 而 打 開 檔 案 ; 檔 案 必 須 已 經 存 在 。 | ||
|
w |
為 只 寫 而 打 開 檔 案 。 如 果 檔 案 已 經 存 在 則 截 斷 (truncate)它 , 如 果 檔 案 不 存 在 則 建 立 一 個 新 檔 案 。 | ||
|
w+ |
為 讀 寫 而 打 開 檔 案 。 如 果 檔 案 已 經 存 在 則 截 斷 (truncate)它 , 如 果 檔 案 不 存 在 則 建 立 一 個 新 檔 案 。 | ||
|
a |
為 只 讀 而 打 開 檔 案 。 如 果 檔 案 不 存 在 , 則 建 立 一 個 新 的 空 檔 案 。 設 置 初 始 訪 問 位 置 為 檔 案 的 結 束 處 。 | ||
|
a+ |
為 讀 寫 而 打 開 檔 案 。 如 果 檔 案 不 存 在 , 則 建 立 一 個 新 的 空 檔 案 。 設 置 初 始 訪 問 位 置 為 檔 案 的 結 束 處 。 |
在 第 二 種 形 式 下 , access 由 某 些 下 列 標 誌 的 一 個 列 表 構 成 , 所 有 這 些 都 有 標 準 的 POSIX 意 義 。 必 須 有 一 個 標 誌 是 RDONLY、 WRONLY 或 RDWR 中 的 一 個 。
|
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 返 回 的 通 道 標 識 符 來 向 這 個 命 令 的 輸 入 管 道 寫 或 從 它 的 輸 出 管 道 讀 。 如 果 使 用 了 只 寫 訪 問 (例 如 , 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 命 令 來 為
打 開 的 串 行 端
口 查 詢 和 設 置
下 列 選 項 : │
−mode
baud,parity,data,stop
│
這 個 選 項 是 由 逗 號 分 隔 的 四 個 值 的 一 個 集 合 : │ 這 個 串 行 端 口 的 波 特 (baud)率 、 奇 偶 校 驗 (parity)、 數 據 位 數 、 和 停 止 位 。 baud │ 率 是 指 定 連 接 速 度 的 一 個 簡 單 整 數 。 Parity 是 下 列 字 母 之 一 : │ n、 o、 e、 m、 s; 分 別 表 示 奇 偶 校 驗 選 項 「 none」 、 「 odd」 、 「 even」 、 「 mark」 、 或 「 space」 。 Data │ 是 數 據 位 數 , 應 當 是 從 5 到 8 中 的 一 個 整 數 , 而 stop │ 是 停 止 位 的 數 目 , 應 當 是 整 數 1 或 2。 │
−pollinterval msec │
只 在 Windows │ 上 串 行 端 口 能 獲 得 這 個 選 項 , 它 被 用 來 設 置 檔 案 事 件 輪 詢 (poll)之 間 的 最 大 時 間 。 這 影 響 整 個 │ Tcl │ 解 釋 器 檢 查 事 件 中 間 的 時 間 間 隔 (總 是 採 用 最 小 的 值 )。 只 有 在 你 想 要 使 輪 詢 這 個 串 行 端 口 的 時 間 間 隔 小 於 │ 10 msec (預 設 值 )時 才 使 用 這 個 選 項 。 │
−lasterror │
只 在 Windows │ 上 串 行 端 口 能 獲 得 這 個 選 項 , 並 只 能 查 詢 (只 在 直 接 請 求 時 報 告 )。 在 串 行 通 信 出 錯 的 情 況 下 , read │ 或 puts 返 回 一 個 一 般 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, 這 裏 的 │ X 是 a 或 │ b, 但 是 可 以 使 用 映 射 到 一 個 串 行 端 口 的 任 何 偽 檔 案 (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 │
│