付録 B
では,System V 実行環境の C 言語プログラムに対するソース・コード互換性を得る方法について説明します。
また,オペレーティング・システムの省略時のシステム・コールおよびライブラリ関数と,System V 実行環境におけるシステム・コールおよびライブラリ関数との違いについても要約します。
B.1 ソース・コードの互換性
C 言語プログラムに対するソース・コード互換性を得るには,使用するシェルの
PATH
環境変数を変更してアプリケーションのコンパイルおよびリンクを行います。
PATH
環境変数を変更する場合,System V 実行環境へのアクセスは次の 2 つのレベルで行なわれます。
第 1 のレベルでは,変更した
PATH
環境変数によって,オペレーティング・システムの省略時のバージョンのコマンドの代わりに System V バージョンの多くのコマンドが実行されます。
第 2 のレベルでは,System V の
cc
コマンドあるいは
ld
コマンドが実行されます。
System V バージョンの
cc
コマンドおよび
ld
コマンドを実行すると,
システム・コールおよびサブルーチンに対するソース・コード参照は,System V 実行環境のライブラリによって解決されます。
System V 実行環境でそのサブルーチンあるいはシステム・コールが見つからない場合,ソース・コード参照は標準のライブラリおよびコマンド行で指定したその他のライブラリで解決されます。
また,標準のヘッダ・ファイルの代わりに System V バージョンのヘッダ・ファイル (/usr/include
ファイルなど) を使用するように,インクルード・ファイルの探索パスが変更されます。
システム・コールを起動するライブラリ関数は,システム・コール・テーブルを使用してシステムのプリミティブをカーネルに配置します。 基本オペレーティング・システムには,System V 用のものを含め,いくつかのシステム・テーブルが用意されています。 System V 動作を示すシステム・コールは,システム・コール・テーブルの System V の部分にエントリされています。
PATH
環境変数を System V 実行環境に設定してプログラムをリンクすると,システム・コールの参照を解決するために
libsys5
が探索されます。
図 B-1
に示すように,libsys5
によって起動される
unlink()
システム・コールは,システム・コール・テーブルの System V 部分のエントリをポイントします。
このマッピングは,システムの省略時の
unlink()
システム・コールのマッピングとは別のカーネル領域に対して行われます。
図 B-1: システム・コールの解決
System V 実行環境の
cc
および
ld
コマンドは (指定されている場合),コマンド実行前に,システムの省略時の
cc
および
ld
コマンドにいくつかのオプションを追加するシェル・スクリプトです。
cc
コマンドは,SVID バージョンのヘッダ・ファイルを使用するために
-Ipath
オプションをコマンド行に自動的に挿入します。
たとえば,省略時のヘッダ・ファイルの代わりに
/usr/include
ファイルが使用されます。
SVID バージョンと違いのないシステム・ヘッダ・ファイルについては,省略時のファイルが使用されます。
cc
および
ld
コマンドは,自動的に次のオプションを使用します。
-Lpath
System V ライブラリのパスを提供します。
-lsys5
システム・コールおよびサブルーチンの参照を解決する際に,標準の C ライブラリの前に
libsys5.a
ライブラリを探索するよう指定します。
-D_ _SVID_ _
省略時のシステムから SVID 固有の動作を選択式に有効にします。
省略時の設定では,cc
コマンドはシェアード・ライブラリを使用してプログラムを動的にリンクします。
System V 実行環境は,この機能をサポートするために,libsys5.a
に加えて
libsys5.so
をサポートしています。
System V バージョンの
cc
および
ld
コマンドは,省略時のバージョンの
cc
および
ld
コマンドにユーザが指定したコマンド行オプションを渡します。
このため,ユーザはライブラリの階層構造を作成することができます。
たとえば,PATH
環境変数に System V 実行環境が設定されていて,算術ライブラリ関数および
/local/lib
ディレクトリの
libloc.a
関数への参照がプログラムに含まれている場合,次のようにプログラムをコンパイルします。
% cc -non_shared -L/local/lib src.c -lm -lloc
System V
cc
コマンドは,このコマンド行を読み取り,省略時のライブラリより優先して System V 実行環境ライブラリを探索するのに必要なオプションを追加します。
また,このコマンドは
/usr/include
の標準のヘッダ・ファイルの代わりに,System V のヘッダ・ファイルをインクルードします。
ご使用の環境に SVID 2 が設定されている場合は,前のコマンドは次のように処理されます。
/bin/cc -D__SVID__ -I$SVID2PATH/usr/include -L$SVID2PATH/usr/lib \ -non_shared -L/local/lib src.c -lm -lloc -lsys5
このコマンドを使用すると,次の順番でライブラリが探索されます。
/usr/lib/libm.a
/local/lib/libloc.a
SVID2PATH/usr/lib/libsys5.a
/usr/lib/libc.a
探索されるライブラリおよびその順序は実行する関数によって異なります。
詳細については,
cc
(1)ld
(1)B.2 システム・コールとライブラリ・ルーチンの要約
表 B-1 に,System V 実行環境におけるシステム・コールの動作について示します。 表 B-2 には,System V 実行環境におけるライブラリ関数の動作について示します。
これらのシステム・コールおよびライブラリ関数の詳細については,それぞれのリファレンス・ページを参照してください。
表 B-1: システム・コールの要約
システム・コール | System V 動作 |
longjmp (2)setjmp (2) |
スタックのみをリストア/保管する。 |
mknod (2) |
ディレクトリ,通常ファイル,特殊ファイルの作成機能を提供する。 |
mount (2sv)umount (2sv) |
省略時のバージョンとは異なる引数を取り,
|
open (2) |
省略時の設定として
O_NOCTTY
フラグを設定しないように指定する。
この設定によって,ある条件を満たせば,端末装置に対するオープン呼び出しで,そのデバイスがそのプロセスの制御端末となることが可能になる。 |
pipe (2) |
STREAMS ベースのファイル記述子に対するパイプ操作をサポートする。 |
sigaction (2)signal (2) |
カーネルがシグナル・ハンドラに追加情報を渡すことを指定する。
この情報には,siginfo
構造体にシグナルを発行した理由,ucontext
構造体にシグナルを発行したときの呼び出しプロセスのコンテキストを含みます。 |
sigpause (2) |
呼び出しプロセスのシグナル・マスクから指定したシグナルのブロックを解除し,シグナルを受信するまで呼び出しプロセスを停止する。
SIGKILL
および
SIGSTOP
のシグナルはリセットできない。 |
sigset (2) |
SIGCHLD
のディスポジションを
SIG_IGN
に設定した場合,呼び出しプロセスの子プロセスは,プロセス終了時にゾンビに変わることができないことを指定する。
子プロセスの終了を親プロセスが待つ場合,すべての子プロセスが終了するまで親プロセスはブロックされる。
この操作は,値 -1 を返し
errno
を [ECHILD] に設定する。 |
unlink (2) |
スーパユーザを含め,ユーザは空でないディレクトリのリンクを解除することができない。
errno
を ENOTEMPTY に設定する。
ディレクトリが空の場合,スーパユーザはリンクを解除できる。 |
ライブラリ関数 | System V 動作 |
getcwd (3) |
|
mkfifo (3) |
STREAMS ベースの FIFO の作成をサポートし,/dev/streams/pipe
を使用する。 |
mktemp (3) |
getpid
関数を使用して,一意な名前の
pid
の部分を取得する。 |
ttyname (3) |
端末が擬似端末装置の場合,/dev/pts/
で始まるパス名で文字列のポインタを返す。 |