## Tcl8.6.17/Tk8.6.17 Documentation > Tcl Commands > close

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

### NAME

close — 開いている通信路を閉じる Close an open channel

### SYNOPSIS

close channelId ?r(ead)|w(rite)?

### 説明 DESCRIPTION

通信路識別子 channelId で与えられている通信路を閉じるか半閉じする｡　　　 Closes or half-closes the channel given by channelId.

通信路識別子 ChannelId は､Tcl 標準通信路(stdin か stdout か stderr)､又は､ open や socket の起動からの返り値､又は､Tcl 拡張によってもたらされた命令が作成した通信路の返り値でなければならない｡ ChannelId must be an identifier for an open channel such as a Tcl standard channel (stdin, stdout, or stderr), the return value from an invocation of open or socket, or the result of a channel creation command provided by a Tcl extension.

引数１つの形式は単純な “完全閉鎖” である: 全ての出力用緩衝域は通信路の出力端末装置に払出され､どの入力用緩衝域も消去され､基礎ファイルや端末装置は閉じられ､そして､通信路識別子 channelId は利用できなくなる｡ 　　　 The single-argument form is a simple “full-close”: all buffered output is flushed to the channel's output device, any buffered input is discarded, the underlying file or device is closed, and channelId becomes unavailable for use.

もし､通信路が同期されていると､本命令は､全ての出力が払出される迄制御が返って来ない｡もし､通信路が非同期で､未払出しの出力がある場合､その通信路は開いたまま残って､この命令の制御はすぐさま戻ってくる; 出力は背景処理で払出され､全て払出しが完了した時にその通信路は閉じられる｡ 　　　 If the channel is blocking, the command does not return until all output is flushed. If the channel is nonblocking and there is unflushed output, the channel remains open and the command returns immediately; output will be flushed in the background and the channel will be closed when all the flushing is complete.

もし､通信路識別子 channelId がパイプの同期通信路であるなら､ close は子供の処理が完了するまで待たされる｡ 　　　 If channelId is a blocking channel for a command pipeline then close waits for the child processes to complete.

もし､通信路が解釈実行機能間で共有されていると､ close は起動した解釈実行機能内では channelId を使用できなくするが､共有している全ての解釈実行機能が通信路を閉じる迄は､他には何も効果を及ぼさない｡通信路が登録されている全ての解釈実行機能が close を起動すると､上述の､追出し動作が起る｡通信路の共有の記述については､ interp 命令を参照されたい｡ 　　　 If the channel is shared between interpreters, then close makes channelId unavailable in the invoking interpreter but has no other effect until all of the sharing interpreters have closed the channel. When the last interpreter in which the channel is registered invokes close, the cleanup actions described above occur. See the interp command for a description of channel sharing.

通信路は解釈実行機能が破棄された時と､処理が完了した時に自動的に閉じられる｡ 8.6 版からは(TIP#398)非同期通信路は完了した時に､最早同期様式に切換わらない; これにより､同じ層上の通信規約で動作する装置又は通信中の通信路が立ち往生しても適宜退出する事を保障していた｡既存の立ち往生した非同期通信路の適切な追出しを確実に行う為に､使用者は今は(a)積極的に同期式に戻すか(b)設定した時 "0" でない場合に､以前の挙動を再保存する環境変数 TCL_FLUSH_NONBLOCKING_ON_EXIT を使うかの何れかを行わねばならない｡ 　　　 Channels are automatically closed when an interpreter is destroyed and when the process exits. From 8.6 on (TIP#398), nonblocking channels are no longer switched to blocking mode when exiting; this guarantees a timely exit even when the peer or a communication channel is stalled. To ensure proper flushing of stalled nonblocking channels on exit, one must now either (a) actively switch them back to blocking or (b) use the environment variable TCL_FLUSH_NONBLOCKING_ON_EXIT, which when set and not equal to "0" restores the previous behavior.

この命令は空文字列を返す､又､出力を払出している間に不具合が生じると不具合を発生することがある｡もし､ open で作成した命令パイプライン内の命令が不具合を返すと､ close は不具合を発生する(exec 命令に準拠)｡ The command returns an empty string, and may generate an error if an error occurs while flushing output. If a command in a command pipeline created with open returns an error, close generates an error (similar to the exec command.)

引数二つの書式は “半閉じ” を形成する : 受け口や命令パイプの様な双方向通信路と(短縮形でもよいが)方向が与えらると､その方向に対する副の流れのみが閉じる｡これは受け口の 遮断() や､命令パイプに関する片端の閉鎖を意味する｡そこで､ Tcl-水準通信路データ構造は､別方向が依然開いているかによって保持又は解放される｡ 　　　 The two-argument form is a “half-close”: given a bidirectional channel like a socket or command pipeline and a (possibly abbreviated) direction, it closes only the sub-stream going in that direction. This means a shutdown() on a socket, and a close() of one end of a pipe for a command pipeline. Then, the Tcl-level channel data structure is either kept or freed depending on whether the other direction is still open.

既に半閉じになった双方向通信路上の､引数が一個の書式の閉鎖は “任務の終了” と定義される｡既に半閉じのもの､又は誤った側の片向通信路への半閉じは不都合を惹き起こす｡ 　　　 A single-argument close on an already half-closed bidirectional channel is defined to just “finish the job”. A half-close on an already closed half, or on a wrong-sided unidirectional channel, raises an error.

命令パイプ内の場合､子供を回収する義務が最後の閉鎖や半閉じの肩の上にのし掛かる､それは異常な終了不都合報告が許容されることになる｡ 　　　 In the case of a command pipeline, the child-reaping duty falls upon the shoulders of the last close or half-close, which is thus allowed to report an abnormal exit error.

現在の所､受け口と命令パイプだけが半閉じに対応している｡将来の拡張では折返された通信路と積層された通信路もこれを行う｡ 　　　 Currently only sockets and command pipelines support half-close. A future extension will allow reflected and stacked channels to do so.

### 用例 EXAMPLE

この例は､不具合が生じた時でも､ catch と close と return を組合せて､ファイルを閉じることを励行させるために､Tcl を如何に使用することができるかを示す: 　　　 This illustrates how you can use Tcl to ensure that files get closed even when errors happen by combining catch, close and return:

    proc withOpenFile {filename channelVar script} {
        upvar 1 $channelVar chan
        set chan [open $filename]
        catch {
            uplevel 1 $script
        } result options
        close $chan
        return -options $options $result
    }

### SEE ALSO

file, open, socket, eof, Tcl_StandardChannels

### KEYWORDS

blocking, channel, close, nonblocking, half-close
Copyright © 1993 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.