Open

ReferenceTOPKeywords

コマンド名

open - ファイルベースチャネル、あるいはコマンドパイプラインのチャネルをオープンします。

構文

open fileName
open fileName access
open fileName access permissions
 

解説

本コマンドはファイル、シリアルポート、またはコマンドパイプラインをオープンし、 readputs、そしてcloseなどのコマンドの呼び出しに使われるチャネル識別子を返します。 fileNameの最初の文字が | でない場合、このコマンドはファイルをオープンします。fileNameはオープンすべきファイルの名前を指定します。 これは filenameマニュアルエントリで記述されているルールに従わなくてはなりません。

access引数は存在するなら、ファイル(またはコマンドパイプライン)がどのようにアクセスされるかを示します。1番目の形式ではaccess は次の値の何れかを持ちます。

r
r+
w
w+
a
a+
r
ファイルを読み取り専用にオープンします。ファイルは既に存在していなければなりません。これは accessが指定されない場合のデフォルト値です。
r+
ファイルを読み書き両用にオープンします。ファイルは既に存在していなければなりません。
w
書き込み用に空のファイルを開きます。指定したファイルが既に存在すると、そのファイルの内容は破棄されます。
w+
読み書き両方のモードで空のファイルを開きます。指定したファイルが既に存在すると、そのファイルの内容は破棄されます。
a
ファイルを書き込み専用にオープンします。ファイルが存在しなければ新しい空のファイルが作成されます。最初のアクセス位 置はファイルの末尾に設定されます。
a+
ファイルを読み書き両用にオープンします。ファイルが存在しなければ新しい空のファイルが作成されます。最初のアクセス位 置はファイルの末尾に設定されます。

2番目の形式ではaccessは以下のフラグから構成されるリストです。すべてのフラグはPOSIX標準に従います。フラグは全てRDONLYWRONLYあるいはRDWRのいずれかでなければなりません。

RDONLY
WRONLY
RDWR
APPEND
CREAT
EXCL
NOCTTY
NONBLOCK
TRUNC
 
RDONLY
ファイルを読み込み専用にオープンします。
WRONLY
ファイルを書き込み専用にオープンします。
RDWR
ファイルを読み書き両用にオープンします。
APPEND
ファイルポインタを各書き出しの直前ファイルの末尾に設定します。
CREAT
ファイルがまだ存在していなければ作成します(このフラグが無ければ、ファイルが存在しない場合はエラーになります)。
EXCL
CREATも指定されている場合、ファイルが既に存在している場合にエラーが返されます。
NOCTTY
ファイルが端末デバイスの場合、このフラグはファイルがプロセスのコントロールターミナルになることを防止します。
NONBLOCK
ファイルをオープンしている間に、及び後続する可能なI/O操作の間で、プロセスがブロックすることを防止します。このフラグの正確な動作はシステムとデバイスに依存します。 使用するのはお薦めできません (ファイルを非ブロックモードにするにはfconfigureコマンドを使った方が良いです)。 詳細はシステムのドキュメントのシステムコールopenO_NONBLOCKフラグを参照してください。
TRUNC
ファイルが存在するなら長さ0に切りつめられます。

新しいファイルがオープン中で作成される場合、 permissions(整数)はプロセスのファイルモード作成マスクと共にで新しいファイルの許可を設定することに使われます。 permissionsのディフォルトは0666です。

注意点として、本コマンドによって作成されたチャネルからバイナリデータを読み書きする場合、あらゆるバイナリデータを転送する前にfconfigureコマンドを使ってチャネルの-translationオプションを binaryに変更する必要があります。 これは、いくつかのCライブラリ関数fopen ( ) のバージョンに対するaccess 引数の一部として渡す文字"b"と対応します。

コマンドパイプライン

fileNameの最初の文字が"|"なら、fileNameの残された文字は呼び出すべきコマンドパイプラインを execの引数と同じ形式で記述する引数のリストとして扱います。この場合ではopenによって返されたチャネル識別 子は、accessの値に依存し、コマンドの入力パイプへの書き込み、或いは出力パイプからの読み出しに使われます。書き込み専用(例accessw)のアクセスが行われている場合、コマンドにより上書きがされていない限り、パイプラインの標準出力は現在の標準出力にされます。読み込み専用のアクセスが行われている場合、(例 accessr)、コマンドにより上書きがされていない限り、パイプラインの標準入力は現在の標準入力にされます。openに返されたチャネルIDを引数として使い、spawnedプロセスのIDはpidコマンドによってアクセス可能です。

シリアル通信

fileNameがシリアルポートを示している場合、指定されたシリアルポートはプラットフォームに依存した方法でオープンされ、初期化されます。シリアルポートのオープンに使用できるfileNameの値はPORTABILITY ISSUESセクションで述べられます。

fconfigureコマンドはシリアルポートに特有の追加configurationオプションを検索・設定するために使われます。

移植性の問題

Windows (全てのバージョン)
fileNameがシリアルポートをオープンするための正当な値は comX:で、Xは基本的に1から4までの番号で、システムが偶然4個以上のシリアルポートを持っている場合、有効番号は1から9までの番号になります。存在しない番号をオープンしたり、番号9を超えるシリアルポートをオープンすると失敗になります。もう1つのシリアルポートをオープンするフォーマットは、ファイル名\\.\comXです。ここでXはシリアルポートと対応する数値で、注意すべきはこの方法がWindows 95 またWindows 98上でかなり遅いことです。
Windows NT
Tclが対話的に動作している場合、本物のコンソールと、 コマンドパイプライン両方が、標準入出力を使用していると、不都合が発生する場合があります。コマンドパイプラインが読み取り用にオープンされると、コンソールで入力された行のいくつかはコマンドパイプラインに送られ、いくつかはTclのインタプリタに送られてしまいます。コマンドパイプラインが書き出し用にオープンされると、コンソールに入力されたキー入力はパイプが閉じられるまで表示されません。 この不具合はコマンドパイプラインが16ビットと32ビット両方のアプリケーションを実行するときに起こります。これらの問題はTclとサブアプリケーションの両方がコンソールを取り合う場合のみ起こります。コマンドパイプラインがスクリプ トから起動された場合、Tclはコンソールにアクセスしないので、前述の問題は起こりません。コマンドパイプラインが標準入出力を使用しないでファイルへまたはファイルからリダイレクトする場合も、前述の問題は起こりません。
Windows 95
16ビットDOSアプリケーションを実行するコマンドパイプラインは読み書き両用にはオープンできません。なぜなら、パイプから標準入力を受け取る16ビットDOSアプリケーションと、パイプへ標準出力を送る16ビットDOSアプリケーションは同期的に動作するためです。16ビットDOSアプリケーションを実行しないコマンドパイプラインは非同期的に動作し、読み書き両用にオープンできます。 
 
Tclが対話的に動作している場合、本物のコンソールと、 コマンドパイプライン両方が、標準入出力を使用していると、不都合が発生する場合があります。コマンドパイ プラインが、32ビットアプリケーションからの読み込み用にオープンされると、コンソールに入力されたキー入力のいくつかはコマンドパイプラインに送られ、いくつかはTclのインタプリタに送られます。コマンドパイプラインが32ビットアプリケーションへの書き出し用にオープンされると、コンソールに入力されたキー入力はパイプが閉じられるまで表示されません。 これらの問題はTclとサブアプリケーションの両方がコンソールを取り合う場合にのみ起こります。コマンドパイプラインがスクリプ トから起動された場合、Tclはコンソールにアクセスしないので、前述の問題は起こりません。コマンドパイプラインが標準入出力を使用しないでファイルへ、またはファイルからリダイレクトする場合も、前述の問題は起こりません。
Tclが対話的に動作しているかに関わらず、16ビットDOSアプリケーションからの読み取り用にコマンドパイプラインがオープンされると、openの呼び出しはコマンドパイプラインの標準出力からファイル末尾を受け取るまで制御を返しません。コマンドパイプラインが、16ビットDOSアプリケーションへの書き出し用にオープンされると、コマンドパイプラインが実際に閉じられるまでいかなるデータもコマンドパイプラインの標準出力に送られません。この問題が発生する原因は上で示されたように16ビットDOSアプリケーションが同期的に動作するためです。
Macintosh
Macintoshではシリアルポートのオープンは現在のところ実装されていません。
 
アプリケーションが標準入出力の概念をサポートしていないので、Macintoshはコマンドパイプラインのオープンをサポートしていません。
Unix
シリアルポートをオープンするためのfileNameの正当な値は基本的には/dev/ttyXフォーマットで、Xabです。しかしシリアルポートにマップされた擬似ファイルも使用できます。
Tclが対話的に動作していると、本物のコンソールとコマンドパイプライン両方が標準入出力を使用している場合、不都合が発生することがあります。コマンドパイプラインが読み取り用にオープンされると、コンソールで入力された行のいくつかはコマンドパイプラインに送られ、いくつかはTclのインタプリタに送られてしまいます。この問題はTclとサブアプリケーションの両方がコンソールを取り合う場合のみ起こります。コマンドパイプラインがスクリプトから起動された場合、Tclはコンソールにアクセスしないので、前述の問題は起こりません。コマンドパイプラインが標準入出力を使用しないでファイルへまたはファイルからリダイレクトする場合も、前述の問題は起こりません。

様々なプラットホームでアプリケーションを実行することに関するコマンドパイプラインの特有情報以外の詳細については execコマンドのPORTABILITY ISSUESセクションを参照してください。

参照

file, close, filename, fconfigure, gets, read, puts, exec, pid, fopen

キーワード

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


Copyright © 1993 The Regents of the University of California. Copyright © 1994-1996 Sun Microsystems, Inc. Copyright © 1995-1997 Roger E. Critchlow Jr.