日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

HP OpenVMS
HP C ランタイム・ライブラリ・リファレンス・マニュアル (上巻)


目次 索引



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 バージョンではサポートされていませんでしたが, OpenVMS Version 8.4 以降では, DECC$POSIX_COMPLIANT_PATHNAMES が定義されている場合も論理名とデバイス名がサポートされます。

DECC$POSIX_COMPLIANT_PATHNAMES を有効にすると,次の C RTL 機能論理名は無視されます。

DECC$ARGV_PARSE_STYLE
DECC$DISABLE_POSIX_ROOT
DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION
DECC$EFS_CASE_PRESERVE
DECC$EFS_CASE_SPECIAL
DECC$EFS_CHARSET
DECC$EFS_NO_DOTS_IN_DIRNAME
DECC$ENABLE_TO_VMS_LOGNAME_CACHE
DECC$FILENAME_UNIX_NO_VERSION
DECC$FILENAME_UNIX_ONLY
DECC$FILENAME_UNIX_REPORT
DECC$NO_ROOTED_SEARCH_LISTS
DECC$READDIR_DROPDOTNOTYPE
DECC$READDIR_KEEPDOTDIR
DECC$RENAME_ALLOW_DIR
DECC$RENAME_NO_INHERIT
DECC$UNIX_PATH_BEFORE_LOGNAME


POSIX 準拠モードで動作している場合, C RTL 関数 decc$to_vmsでは, POSIX パス名を,引用符で囲まれた RMS のパス名へ変換します。逆に, decc$from_vms関数と decc$translate_vms関数では,引用符で囲まれたパス名から引用符と接頭辞 ^UP^を削除して POSIX パス名に変更します (たとえば, "^UP^a/b"a/bになります)。 POSIX 準拠モードでなければ,これらの関数は以前と同じように動作します。

12.3.3 シンボリック・リンク関数

表 12-1 に, HP C Run-Time Library (RTL) のシンボリック・リンク関数とその説明を示します。各関数の詳細については,「リファレンス・セクション」を参照してください。

表 12-1 シンボリック・リンク関数
関数 説明
lchown ファイルのオーナとグループを変更します。ファイルがシンボリック・リンクである場合は,そのシンボリック・リンクのオーナを変更します ( chown は,シンボリック・リンクの指しているファイルを変更します)。
lstat 指定したファイルの情報を取得します。ファイルがシンボリック・リンクである場合は,そのリンク自体の情報が返されます ( stat は,シンボリック・リンクが指しているファイルの情報を返します)。
readlink シンボリック・リンクの内容を読み取って,ユーザの用意したバッファに置きます。
realpath POSIX ルートから始まる絶対パス名が返されます。この関数は,POSIX 準拠モード (つまり, DECC$POSIX_COMPLIANT_PATHNAMES が有効な場合) でだけサポートされています。
unlink システムからシンボリック・リンクを削除します。
symlink 指定した内容を持つシンボリック・リンクを作成します。



12.3.4 既存関数の変更

今までに説明した新しい関数の追加に加えて,次の C RTL 関数が,シンボリック・リンクをサポートするために変更されています。

creat
ファイルの新しいバージョンを作成するときに同じ名前のシンボリック・リンクがすでに存在していると,そのシンボリック・リンクが参照しているファイルを作成するように変更されています。

open
open関数は, file_spec パラメータで指定したファイルがシンボリック・リンクであると,そのシンボリック・リンクが指しているファイルをオープンするように変更されています。

deleteremove
deleteremove関数は,指定したファイルがシンボリック・リンクであると,そのシンボリック・リンクの参照しているファイルではなく,リンク自体を削除するように変更されています。

また,シンボリック・リンクの解決でループが見つかったときは, Open Group の仕様に従って errno値 ELOOP が返されます。

12.3.5 POSIX に準拠していない動作



POSIX 準拠のパス名を使用している場合は,対象となるファイルに複数のバージョンが存在していても,アクセスできるのは最新バージョンのファイルだけです。また,ファイルを削除しても,実際に削除されるのは,バージョン番号の最も高いファイルだけです。

同じディレクトリにファイル "a"とディレクトリ "a.DIR;1"が存在している場合に POSIX 準拠モードでアクセスすると,次のように処理されます。

  • 入力としてディレクトリの名前しか受け付けない関数 ( chdiropendirなど) からは,エラー (ENOEXIST) が返されます。

  • 入力としてディレクトリでないファイルしか受け付けない関数 ( openなど) では,ディレクトリでない方のファイルを対象にして処理が行われます。

  • 入力としてファイルもディレクトリも受け付ける関数 ( statなど) では,ディレクトリでない方のファイルを対象にして処理が行われます。

  • readdirからは,ファイルのエントリとディレクトリのエントリが両方とも返されます。



12.4 RMS インタフェース



ここで使用している「引用符で囲んだパス名」とは,この章の前半で説明したように,先頭にタグ文字列 ^UP^を付けて,さらにその全体を引用符で囲んだ POSIX パス名のことです。また,そのような POSIX パス名の中に引用符がある場合は,その引用符を 2 個続けることで,引用符で囲まれた文字列全体が DCL の場合と同じように扱われるようにする必要があります。

引用符で囲んだパス名は,プライマリ名,デフォルト名,および関連名で使用することができます。 RMS では, ^UP^接頭辞と開始/終了引用符を検出すると,残りの文字を標準の POSIX 名として解釈します (ただし,パス名の中に引用符が 2 つ連続してある場合は,そのペアを 1 つの引用符として扱います)。また(「引用符で囲んだパス名」にワイルドカードが使用されている場合などは),「引用符で囲んだパス名」を展開して得られたファイル指定も,引用符で囲んだパス名として返します。

返された「引用符で囲んだパス名」の構成要素は,NAM または NAML で次のように参照されます。

  • node は NULL である。

  • dev は "^UP^ である。

  • dir は, dev 文字列と最後のスラッシュ (/) との間にあるすべての文字と最後のスラッシュから構成される。

  • name は, dir の直後から最後のピリオド (.) までの間にあるすべての文字から構成される (最後のピリオドがない場合は,dir の直後から終了二重引用符 (") までの間にあるすべての文字から構成される)。

  • type は, name の直後から終了二重引用符 (") までの間にあるすべての文字から構成される。

  • version は二重引用符 (") である。

dir フィールド,name フィールド,および type フィールドは NUL であっても構いません。

たとえば,引用符で囲んだパス名 "^UP^/a/b.c"は,次の要素から構成されています。

node は NUL。
dev は "^UP^。
dir は /a/。
name は b。
type は .c。
version は "。

シンボリック・リンクは,次の RMS ルーチンでサポートされています。

  • SYS$OPEN --- シンボリック・リンクが指しているファイルを対象にして動作します。

  • SYS$CREATE --- シンボリック・リンクが指しているファイルを作成します。

  • SYS$PARSE ---ファイル指定文字列を解析して,さまざまな NAM ブロック・フィールドを埋めます。

  • SYS$SEARCH ---ターゲット・ファイルの DVI と FID を返します。 DID はゼロです。結果として得られる名前は,ターゲット・ファイルの名前ではなく,シンボリック・リンクの名前です。
    NAML$V_OPEN_SPECIAL を設定すると,SYS$OPEN と SYS$SEARCH はシンボリック・リンクをたどらなくなります。

RMS で行う POSIX パス名の処理には,次の制約があります。

  • 引用符で囲んだパス名でプライマリ・ファイルを指定した場合, SYS$SEARCH から返されるファイルは 1 つだけです。また,パス名には,ワイルドカードとして定義されている文字は使用できません。

  • 引用符で囲んだパス名でプライマリ・ファイルを指定すると,デフォルトの指定と,関連する指定が無視されます。

  • OpenVMS の従来のファイル指定方法でプライマリ・ファイルを指定する場合は,デフォルトの指定に,引用符で囲んだパス名を使用できます。ただし,そのデフォルトの指定から使用されるのは,ファイル名とタイプだけです。



12.4.2 アプリケーションから制御可能な RMS のシンボリック・リンク処理

RMS が一般的なファイル操作でシンボリック・リンクに出会ったときの動作は, DCL コマンドやユーティリティなどのアプリケーションで制御できるようにする必要があります。その中でも特に必要なのは,シンボリック・リンクに格納されているパス名を,パス名の処理とディレクトリの検索に含めるかどうかの制御です。また,シンボリック・リンクに出会ったときに,その状況に応じて異なる動作を指定できる機能も必要です。

こうしたアプリケーションに必要な柔軟性を実現するために NAML$L_INPUT_FLAGS フラグが新たに定義されて,次のような制御が行えるようになっています。

  • SYS$OPEN のデフォルト動作では,渡されたパス名がシンボリック・リンクであると,そのシンボリック・リンクに格納されているパス名で指定されたファイルがオープンされます。 NAML$V_OPEN_SPECIAL フラグを設定しておくと,そのシンボリック・リンク・ファイル自体がオープンされます。

  • NAML$V_OPEN_SPECIAL フラグを設定しておくと, SYS$SEARCH を呼び出して得られる結果がシンボリック・リンクである場合に,そのシンボリック・リンク自体の DVI と FID が返されます。それ以外の場合は,デフォルトの動作が実行されます。つまり,そのシンボリック・リンクに格納されているパス名で指定されたファイルの DVI と FID が返されます。ただし,そのパス名もシンボリック・リンクになっている場合は,シンボリック・リンクでないパス名が見つかるまで処理が繰り返された後, DVI と FID が返されます。

  • SYS$SEARCH でワイルドカードによるディレクトリ検索を行う場合は,その過程でシンボリック・リンクを検出しても,それがディレクトリを参照しているかどうかを調べません。

また,ODS-5 ボリュームでは, RMS 操作でシンボリック・リンクに従うかどうかを指定するのに SPECIAL_FILES フラグが使用されます。シンボリック・リンクに従う RMS 操作としては, SYS$OPEN,SYS$CREATE,SYS$SEARCH,およびすべてのディレクトリ・パスの解釈があります。

SPECIAL_FILES フラグの設定方法については,『HP OpenVMS System Services Reference Manual』および『HP OpenVMS DCL ディクショナリ』を参照してください。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.