B    System V 実行環境における相違点

付録 B では,System V 実行環境の C 言語プログラムに対するソース・コード互換性を得る方法について説明します。 また,オペレーティング・システムの省略時のシステム・コールおよびライブラリ関数と,System V 実行環境におけるシステム・コールおよびライブラリ関数との違いについても要約します。

B.1    ソース・コードの互換性

C 言語プログラムに対するソース・コード互換性を得るには,使用するシェルの PATH 環境変数を変更してアプリケーションのコンパイルおよびリンクを行います。

PATH 環境変数を変更する場合,System V 実行環境へのアクセスは次の 2 つのレベルで行なわれます。

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 コマンドは,自動的に次のオプションを使用します。

省略時の設定では,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
 

このコマンドを使用すると,次の順番でライブラリが探索されます。

  1. /usr/lib/libm.a

  2. /local/lib/libloc.a

  3. SVID2PATH/usr/lib/libsys5.a

  4. /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)

省略時のバージョンとは異なる引数を取り,<sys/types.h> ヘッダ・ファイルをインクルードする必要がある。

注意

System V バージョンの mount リファレンス・ページにアクセスするためには,man コマンドでセクション番号 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 に設定する。 ディレクトリが空の場合,スーパユーザはリンクを解除できる。

表 B-2:  ライブラリ関数の要約

ライブラリ関数 System V 動作
getcwd(3)

現在のディレクトリを取得する。
char *getcwd  (char * buffer, int size );

mkfifo(3) STREAMS ベースの FIFO の作成をサポートし,/dev/streams/pipe を使用する。
mktemp(3) getpid 関数を使用して,一意な名前の pid の部分を取得する。
ttyname(3) 端末が擬似端末装置の場合,/dev/pts/ で始まるパス名で文字列のポインタを返す。