HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
シンボリック・リンクは,他のファイルを指す特殊なファイルです。シンボリック・リンクはディレクトリの 1 つのエントリになっていて,サービスがアクセスするときに POSIX パス名として解釈するテキスト文字列をあるファイルに対応付ける機能があります。シンボリック・リンクへアクセスする操作のほとんどは,そのシンボリック・リンク自体に対してではなく,そのテキスト内容が参照している実際のオブジェクトに対して行われます。したがって,実際のオブジェクトが存在していないと,その操作は失敗します。 OpenVMS におけるシンボリック・リンクは,編成が SPECIAL でタイプが SYMBOLIC_LINK のファイルとして実装されています。
シンボリック・リンクでは,絶対パス名だけでなく相対パス名を指定することもできます。たとえば,内容が ".." というパスで始まるシンボリック・リンクは,その親ディレクトリを参照することになります。また,このシンボリック・リンクを別のディレクトリへ移動すれば,その新しいディレクトリの親ディレクトリを参照することになります。
OpenVMS におけるシンボリック・リンクの使用方法については, 第 12.2 節 を参照してください。
12.1.1.3 マウント・ポイント
マウント・ポイントとは,ファイル・システムが接続されている位置 (実際にはディレクトリ) のことです。 OpenVMS におけるディスク・ボリュームという概念と, UNIX のファイル・システムという用語は,本質的に同じものを表しています。マウント・ポイントを確立すると,マウント・ポイントになる前の元のディレクトリにあった内容へはアクセスできなくなります。
システムをリブートすると,リブートの前に確立されていたマウント・ポイントは無効になります。
OpenVMS でマウント・ポイントを確立する方法については, 第 12.7 節 を参照してください。
12.1.1.4 予約ファイル名「.」と「..」
次に示すように,POSIX には予約済みのファイル名が 2 つあります。
.(現在のディレクトリ)
..(親ディレクトリ)
UNIX システムでは,コンピュータ・システムの特定のハードウェア・デバイスやリソースに特殊ファイルを関連づけており,オペレーティング・システムは,デバイス・ファイルとも呼ぶこの文字型特殊ファイルを使用することで,特定の文字型デバイスに対する入出力を行えるようにしています。
特殊ファイルは,一見しただけでは,通常のファイルと同じように見えます。たとえば次のとおりです。
しかし,この 2 つのファイルには,大きな違いがあります。つまり,通常ファイルはディスクに記録されているデータを論理的にグループ化したものですが,特殊ファイルはデバイス・エンティティに対応したものです。特殊ファイルの例を次に示します。
サポートされている特殊ファイルは,ヌル特殊ファイル (
/dev/null) だけです。このファイルは,GNV 構成処理が実行されている間に作成されます。ヌル特殊ファイルに書き込んだデータは,廃棄されます。また,ヌル特殊ファイルに対して読み取りを実行しても,返ってくるデータは常に 0 バイトです。
12.1.2 OpenVMS インタフェースでの POSIX パス名の使用
OpenVMS のほとんどのアプリケーション,ユーティリティ,および API には, POSIX 準拠の仕様でパス名を渡すことができます。
この仕様には DCL の既存の表記法が採用されていて,引用符で囲んだ文字列の中にさらに引用符が含まれている場合は,その含まれている引用符を 2 回繰り返して指定します。
また,パス名に対して,引用符で囲んだ文字列の使用が将来制約とならないようにしておく場合は (たとえば, 他の構文バリエーションとして Windows と互換性のある名前のサポートを考えている場合など),引用符で囲んだパス名の先頭に先行タグ ^UP^を付加して, DCL,RMS,および OpenVMS のユーティリティでそれが POSIX パス名であることが分かるようにしておく必要があります。ただし,C RTL や GNV に対しては,この要件は必要ありません。
以上の要件を守ると,パス名 /a/b/cは "^UP^/a/b/c"で,また, /a/b"/cは "^UP^/a/b""/c"でそれぞれ指定することになります。
この章の残りの部分では,「POSIX パス名」という用語で変更前のパス名 (
/a/b/cなど) を示し,「引用符で囲んだパス名」という用語で,引用符で囲んだ先行タグ付きのパス名を示します (
"^UP^/a/b/c"など)。
12.1.2.1 POSIX のファイル名に関する特別な考慮事項
OpenVMS で作成するファイルに POSIX ファイル名を使用する場合は,その POSIX ファイル名と OpenVMS のファイル名が同じように表示されると理想的です。たとえば,作成するファイルの名前として POSIX ファイル名 a.bを指定した場合に, OpenVMS 側で a.b;( ;はファイル・バージョン) というファイルが自動的に作成される,という具合にです。
しかし, OpenVMS のファイル名にはその構成要素としてファイル・タイプが必要なので (少なくともピリオドが 1 文字必要),ピリオドのない POSIX ファイル名を直接マッピングすることはできません (たとえば,POSIX ファイル名 aを OpenVMS のファイル名 a;にマッピングするというようなことはできません)。 OpenVMS にとって妥当な解決方法は,ピリオドを付加して (つまりファイル・タイプ・フィールドがヌルであることを示して), POSIX ファイル名 aに対応する OpenVMS のファイル名を a.;にすることです。
ただし,この場合に注意すべきことは,POSIX ファイル名の末尾がピリオドで終わっていても, OpenVMS ではピリオド (つまり,ヌル・タイプ) を付加するということです。これは, a.という POSIX ファイル名と aという POSIX ファイル名が同時に存在している場合に,それらを区別する必要があるからです。
また,OpenVMS のディレクトリには, .DIR;1というタイプとバージョンが割り当てられています。そのため,POSIX ファイル名が aのディレクトリを OpenVMS で作成しようとすると, OpenVMS ファイル名が a.DIR;1というディレクトリが,作成されます。しかし, a.DIRは POSIX ファイル名としても有効なので,もしそのような POSIX ファイル名のファイルが同じディレクトリに存在すれば,そのファイルと, aという POSIX ファイル名のディレクトリを区別できるようにする必要があります。そのため,OpenVMS では,末尾が .DIRで終わる POSIX ファイル名にピリオド (つまり,ヌル・タイプ) を付加するようになっています。その結果,POSIX ファイル名 a.DIRは a.DIR.;になります。
上記の規則に従ったファイル名のマッピング例を以下に示します。次に示すのは, OpenVMS で変更されない (バージョンの追加を除く) POSIX ファイル名の例です。
POSIX ファイル名 OpenVMS 名タイプバージョン DIR での表示
---------------- ---------- ------ ---------- ------------
a.b a .b ; a.b;
a.b; a .b; ; a.b;;
a.b;2 a .b;2 ; a.b;2;
|
次に示すのは,末尾がピリオド ( .) または .DIRで終わっているために, OpenVMS でファイル名を作成するときにピリオドを付加する POSIX ファイル名の例です。
POSIX ファイル名 OpenVMS 名タイプバージョン DIR での表示
---------------- ---------- ------ ---------- ------------
a a . ; a.;
a. a. . ; a^..;
a.. a.. . ; a^.^..;
a.b. a.b. . ; a^.b^..;
a.DIR a.DIR . ; a^.DIR.;
|
最後に示すのは, POSIX ディレクトリの例で,OpenVMS ではそのすべての終わりに .DIR;1を付加しています。
POSIX ファイル名 OpenVMS 名タイプバージョン DIR での表示
---------------- ---------- ------ ---------- ------------
a a .DIR ;1 a.DIR;1
a.dir a.dir .DIR ;1 a^.dir.DIR;1
a. a. .DIR ;1 a^..DIR;1
|
POSIX ファイル名に
*または
?文字が含まれている場合は,マッピングできません。この問題は未解決で,将来の OpenVMS リリースで対処される予定です。
12.1.2.2 OpenVMS のファイル名に関する特別な考慮事項
OpenVMS のファイル名を POSIX ファイル名にマッピングするときは (C RTL の関数 readdirの機能),次の規則が適用されます。
OpenVMS ファイル名の末尾が .DIR;1で終わっていて,そのファイルのタイプがディレクトリである場合は, .DIR;1が削除されます。それ以外のファイルは,OpenVMS のファイル名から末尾のセミコロンとバージョン番号が削除されます。
OpenVMS ファイル名の末尾がピリオドで終わっている場合は,そのピリオドが削除されます。
OpenVMS のファイル名に /または NUL 文字が含まれている場合はマッピングできないので,呼び出し側へは,対応するエントリが返されません。
OpenVMS のディレクトリ ..DIR;1と ...DIR;1は,対応する POSIX ファイル名が特別なファイル名 .と ..になるので,マッピングできません。
OpenVMS のファイル
.は,結果として作成される POSIX ファイル名が NULL 文字列になるので,マッピングできません。
12.2 シンボリック・リンクの使用
シンボリック・リンクの作成には,次の方法があります。
12.2.1 DCL によるシンボリック・リンクの作成と使用
DCL コマンドによるシンボリック・リンクの作成方法とアクセス方法の例を,次に示します。
| #1 |
|---|
$ create/symlink="a/b.txt" link_to_b.txt
$
$ dir/date link_to_b.txt
Directory DKB0:[TEST]
link_to_b.txt -> a/b.txt
27-MAY-2005 09:45:15.20
|
この例では,シンボリック・リンク・ファイル link_to_b.txtを作成していて,その内容は,指定したテキスト文字列,つまり,シンボリック・リンクが指すパス名 a/b.txtと同じものになっています。 a/b.txtファイルは,存在していてもいなくてもかまいません。
| #2 |
|---|
$ type link_to_b.txt %TYPE-W-OPENIN, error opening DKB0:[TEST]LINK_TO_B.TXT; as input -RMS-E-FNF, file not found |
この例では,シンボリック・リンクで参照しているファイルへアクセスするために,そのシンボリック・リンク名をコマンドで指定しています。ここでは TYPE コマンドに対してエラー・メッセージが出されて,最初の例で作成したシンボリック・リンクに,対応する参照ファイル a/b.txtが存在していないことが示されています。
| #3 |
|---|
$ create [.a]b.txt
This is a text file.
Exit
$
$ type link_to_b.txt
This is a text file
$
|
この例では,存在していなかったファイル b.txtを,リンクを通して作成しています。また,その後,シンボリック・リンクを通して TYPE コマンドを実行していますが,今回は参照するファイルが存在しているので,成功しています。
このファイルは,次のようにシンボリック・リンクを通して作成することもできます。
$ create link_to_b.txt This is a text file. Exit $ dir [.a] Directory DKB0:[TEST.A] b.txt;1 $ $ type link_to_b.txt This is a text file. $
GNV bash シェルでは, lnユーティリティを次のように使用して,シンボリック・リンクを作成することができます。
bash$ ln -s filename slinkname |
slinkname を参照するユーティリティとコマンドのほとんどは, filename に対して動作するようにリダイレクトされます。しかし, lsなどの一部のコマンドは,それがシンボリック・リンクであることを認識して,そのリンク自体の情報を表示します (その内容など)。
リンクは, rmコマンドで削除できます (ただし,リンクをたどって,それが指しているもの自体を削除することはできません)。
以下の例では,GNV の POSIX コマンドでシンボリック・リンクを管理する方法と, DCL コマンドで管理する方法を比較して示します。
| #1 |
|---|
GNV の場合:
bash$ cd /symlink_example
bash$ echo This is a test. > text
bash$ cat text
This is a test.
bash$ ln -s text LINKTOTEXT
bash$
DCL の場合:
$ set def DISK$XALR:[PSX$ROOT.symlink_example]
$ create text.
This is a test.
Exit
$ type text.
This is a test.
$ create/symlink="text" LINKTOTEXT
|
この例では,テキスト・ファイル textを指す LINKTOTEXT というシンボリック・リンクを作成しています。
| #2 |
|---|
GNV の場合:
bash$ cat LINKTOTEXT
This is a test.
bash$
DCL の場合:
$ type LINKTOTEXT.
This is a test.
$
|
この例では,シンボリック・リンクを指定して,そのテキスト・ファイルの内容を表示しています。
| #3 |
|---|
GNV の場合:
bash$ ls
LINKTOTEXT text
bash$ ls -l
total 1
lrwxr-x--- 1 SYSTEM 1 4 May 12 08:41 LINKTOTEXT -> text
-rw-r----- 1 SYSTEM 1 16 May 12 08:40 text
bash$
DCL の場合:
$ DIR
Directory DISK$XALR:[PSX$ROOT.symlink_example]
LINKTOTEXT.;1 text.;1
Total of 2 files.
$ DIR/DATE
Directory DISK$XALR:[PSX$ROOT.symlink_example]
LINKTOTEXT.;1 -> /symlink_example/text
12-MAY-2005 08:46:31.40
text.;1 12-MAY-2005 08:43:47.53
Total of 2 files.
$
|
この例では,シンボリック・リンクの内容を表示しています。ここで注目して欲しいのは, lsまたは DIR の実行でファイル属性の表示スイッチを指定すると,シンボリック・リンクの内容も表示されるということです。
| #4 |
|---|
GNV の場合:
bash$ rm text
bash$ cat LINKTOTEXT
cat: linktotext: i/o error
bash$ rm LINKTOTEXT
DCL の場合:
$ DEL text.;1
$ TYPE LINKTOTEXT.
%TYPE-W-OPENIN, error opening
DISK$XALR:[PSX$ROOT.symlink_example]LINKTOTEXT.;1 as input
-RMS-E-ACC, ACP file access failed
-SYSTEM-F-FILNOTACC, file not accessed on channel
$ DEL LINKTOTEXT.;1
$
|
この例では,ファイルを削除しています。
この節では, C RTL で行われている POSIX 準拠のパス名とシンボリック・リンクのサポートについて説明します。
12.3.1 DECC$POSIX_COMPLIANT_PATHNAMES 機能論理名
POSIX 準拠のユーザに対して,シンボリック・リンクへ格納するパス名と C RTL 関数へ入力するパス名との間に一貫性を持たせることは,非常に重要です。そのために C RTL では,アプリケーションから C RTL 関数に対して POSIX 準拠のパス名を渡せるようにするための機能論理名, DECC$POSIX_COMPLIANT_PATHNAMES が用意されています。
DECC$POSIX_COMPLIANT_PATHNAMES は特に指定しない限り無効になっていて,通常の C RTL 動作が優先されます。その動作の中には UNIX 仕様のパス名を解釈する方法も含まれていて, POSIX 準拠のパス名処理とは無関係な,異なる規則が使用されます。
DECC$POSIX_COMPLIANT_PATHNAMES を無効にする必要がある場合は,次のように DEFINE を使用して,その値として 0 または "DISABLE" を設定します。
$ DEFINE DECC$POSIX_COMPLIANT_PATHNAMES 0 |
DECC$POSIX_COMPLIANT_PATHNAMES を有効にする場合は,その値として,次のいずれかを設定します。
| 1 | POSIX のみ - パス名をすべて,POSIX のスタイルで表す。 |
| 2 | POSIX 寄り - " : " で終わっているかまたは任意のかっこ " []<> " を含んでいて,しかも SYS$FILESCAN サービスで解析可能なパス名は,そのすべてを OpenVMS のスタイルで表し,それ以外のパス名は,POSIX のスタイルで表す。 |
| 3 | OpenVMS 寄り - " / " を含むパス名と,パス名 " . " および " .. " は, POSIX のスタイルで表し,それ以外のパス名は,OpenVMS のスタイルで表す。 |
| 4 | OpenVMS のみ - パス名をすべて,OpenVMS のスタイルで表す。 |
モード 1 および 4 は,他の共用ライブラリやユーティリティとの間で相互作用があるので,お勧めしません。 |
DECC$POSIX_COMPLIANT_PATHNAMES を有効にすると, C RTL では,規則 (つまり DECC$POSIX_COMPLIANT_PATHNAMES に割り当てた値で決まる規則) に従ってパス名を調べ,それが POSIX のスタイルで表されているのか, OpenVMS のスタイルで表されているのかを判断します。
たとえば,パス名のほとんどを POSIX 準拠で表す場合は,次のように設定します。
$ DEFINE DECC$POSIX_COMPLIANT_PATHNAMES 2 |
C RTL がパス名を POSIX スタイルで表すようになっている場合, C RTL では,受け取った POSIX パス名を OpenVMS のファイル指定へ変換しないで,引用符で囲んだ形式 (この章の前半で説明) に変換します。その結果,RMS ではそのパス名を,シンボリック・リンクで指定されたパス名と同じように処理することができます。
OpenVMS の C RTL では,従来から,UNIX プログラムに対して補足機能を提供してきています。つまり,指定されたファイル名 (またはパス名) の先頭にスラッシュ (/) があるのにもかかわらず,ルートの下にそのファイルが見つからないと, C RTL では,スラッシュの直後にある名前を論理名またはデバイス名として解釈しようとします。たとえば,ファイル名が /SYS$COMMON/SYSEXE/DCL.EXE であれば,それが SYS$COMMON:[SYSEXE] にある DCL.EXE を指しているものと解釈しようとします。また,ファイル名が /$1$DKA500 であれば,デバイス $1$DKA500: を指しているものと解釈しようとします。しかし,DECC$POSIX_COMPLIANT_PATHNAMES を有効にすると, C RTL ではそのような動作を行わなくなります。その理由は,これらの名前が POSIX 名ではないからです。
|