#include <errno.h>
このセクションでは、全システムコールについて説明します。大多数のシステムコールは、通常はあり得ない値を返すことによってエラー条件を示します。エラー条件を示す一般的な値は、–1 または NULL ポインタです。詳細については、個々のシステムコールの説明を参照してください。エラー発生時には、外部変数 errno にエラー番号が与えられます。システムコールが正常に終了しても errno はクリアされないので、この変数はエラーが返されたときにだけ確認してください。
マルチスレッドアプリケーションを使用する場合は、コンパイル時に -mt オプションをコマンド行に指定する必要があります (threads(5) のマニュアルページを参照)。-mt オプションを指定すると、errno はマクロになり、各スレッドが独自の errno を持つことができるようになります。この errno マクロは、変数と同様に、代入文の左辺と右辺のどちらにも使用できます。
アプリケーションは、_lwp_*() 関数ではなく結合スレッドを使用する必要があります。ライブラリはスレッドで使用した場合に限り安全なので、LWP (軽量プロセス) を直接使用することはお勧めできません。
このセクションでは、各システムコールによって生成される可能性があるエラー番号をすべて紹介します。次に、全エラー番号と、そのエラー名 (<errno.h> 中に定義) を示します。
適切な特権がありません。
通常、ファイルの所有者や適切な特権を持つプロセスにのみ許可されている更新処理を、他のユーザーが行おうとした場合に返されます。適切な特権を持つプロセスにのみ許可されている処理を一般のユーザーが実行しようとした場合にも、このエラーが返されます。
制限を無効にするために必要な特権については、個々の関数のマニュアルページを参照してください。
ファイルまたはディレクトリが存在しません。
指定された名前を持つファイルが存在すべきなのに存在しない場合や、パス名に存在しないディレクトリが指定されている場合に返されます。
プロセス、LWP、またはスレッドが存在しません。
指定された PID、LWPID_t、または thread_t に該当するプロセスが、システム上に存在しません。
システムコールに割り込みが発生しました。
システムサービス関数の実行中に、ユーザーがキャッチするように指定した非同期シグナル (割り込みや終了など) が発生しました。シグナルの処理後にシステム関数の実行を再開すると、この関数へのコールがエラーを返したかのように見えます。
マルチスレッドアプリケーションでは、他のスレッドや LWP が fork(2) を呼び出すと、EINTR が返されることがあります。
入出力エラー。
物理的な入出力エラーが発生しました。場合によっては、実際に入出力エラーを起こしたコールの直後のコールで、このエラーが返されることがあります。
デバイスまたはアドレスが存在しません。
特殊ファイルへの入出力を指定したが、該当するサブデバイスが存在しない場合や、デバイスの限度を超えている場合に返されます。テープデバイスがオンライン状態になっていない場合や、ディスクデバイスにディスクパックが読み込まれていない場合にも、このエラーが返されます。
引数リストが長すぎます。
exec ファミリの関数に、ARG_MAX で指定されているバイト数より長い引数リストが渡されました (exec(2) 参照)。引数リストの最大長は、実際の引数リストの長さと、その環境でエクスポートされたシェル変数の長さの合計値です。
実行ファイル形式のエラー。
実行要求のあったファイルのアクセス権は適切であるが形式が正しくない場合に返されます (a.out(4) 参照)。
ファイル番号が正しくありません。
ファイル記述子で定義されたファイルが開いていません。書き込み専用で開いたファイルへの読み取り要求が発行された場合や (read(2))、読み取り専用で開いたファイルへの書き込み要求が発行された場合 ( write(2)) にも、このエラーが返されます。
子プロセスがありません。
wait(3C) 関数呼び出しが実行されたが、これを実行したプロセスには子プロセスがないか、用意されていませんでした。
これ以上のプロセスまたは LWP を処理できません。
システムのプロセステーブルがいっぱいであるか、ユーザーがこれ以上のプロセスの生成を許可されていないことが原因で、fork(2) 関数の実行に失敗しました。メモリー不足やスワップ領域不足が原因で、コールに失敗した場合にも、このエラーが返されます。
領域が不足しています。
brk()、sbrk() (brk(2) を参照)、または exec ファミリの関数の実行中に、プログラムから、システムによる割り当て可能限度を超過した領域が要求されました。割り当て可能領域の最大値は一時的な値ではなく、システムパラメータとして定義されています。アーキテクチャーによっては、テキストセグメント、データセグメント、スタックセグメントなどから過剰なセグメンテーションレジスタが要求された場合や、fork(2) 関数の実行中にスワップ領域が不足した場合にも、このエラーが発生します。
アクセス権がありません。
ファイルをアクセスしようとしましたが、その方法は、ファイル保護システムで許可されていません。
ファイル保護システムを無効にするために必要な特権については、個々の関数のマニュアルページを参照してください。
不正なアドレスです。
ルーチンの引数を使用するときに、ハードウェア障害を検出しました。たとえば、ポインタ引数を使用するルーチンに不正なアドレスが与えられたとき、この状態がシステムによって検出されると、errno の値として EFAULT が設定されることがあります。不正なアドレスの検出機能はシステムによって異なるので、ルーチンに不正なアドレスが渡された場合の動作は一定ではありません。
ブロック型デバイスを指定してください。
ブロック型デバイスを指定しなければならない個所に、ブロック型以外のデバイスまたはファイルが指定されました (例: mount(2) 関数の呼び出し時)。
デバイスは使用中です。
すでにマウントされているデバイスをマウントしようとしたか、アクティブなファイル (開いた状態のファイル、現在のディレクトリ、マウントされているファイル、使用中のテキストセグメントなど) が存在しているデバイスのマウントを解除しようとしました。すでに使用可能な状態になっているアカウンティングをさらに使用可能にしようとした場合にも、このエラーが発生します。このとき、デバイスやリソースは使用できません。EBUSY は、相互排他ロック、セマフォ、条件付き変数、読み取り / 書き込みロックでも使用され、ロックが保持されていることを示します。また、プロセッサ制御関数 P_ONLINE でも使用されます。
ファイルが存在します。
不適切なコンテキストで既存のファイル名が指定されました (例: link(2) 関数の呼び出し時)。
クロスデバイスリンクです。
別のデバイス上のファイルへのハードリンクを試みました。
デバイスが存在しません。
デバイスに対する操作が不適切です (例: 書き込み専用デバイスへの読み取り要求)。
ディレクトリではありません。
ディレクトリ名を指定しなければならない個所 (例: chdir(2) 関数の引数、パスの開始部分) に、ディレクトリ以外が指定されました。
ディレクトリです。
ディレクトリに書き込みを実行しようとしました。
不正な引数です。
不正な引数が指定されました。たとえば、マウントされていないデバイスをマウント解除しようとしました。あるいは、signal(3C) または kill(2) 関数の呼び出しにおいて未定義のシグナルが使用されたか、拡張属性に対してサポートされていない操作が行われました。
ファイルテーブルのオーバーフローが発生しました。
システムのファイルテーブルがいっぱいです。SYS_OPEN で指定された数のファイルがすでに開いていて、これ以上のファイルを開くことができません。
開いたファイルの数が多すぎます。
プロセスが、OPEN_MAX ファイル記述子に指定されている数以上のファイルを開くことは、許可されていません。
デバイスの入出力制御 (ioctl) が正しくありません。
特殊文字デバイス以外のファイルを指定して ioctl(2) 関数を呼び出しました。
テキストファイルは使用中です (廃止)。
書き込み用に開いた、プロシージャのみからなるプログラムを 実行しようとしました。プロシージャのみからなるプログラムの実行中に、これを書き込み用に開こうとしたり、削除しようとしても、同じエラーが発生します (このメッセージは廃止されました)。
ファイルが大きすぎます。
ファイルのサイズが、RLIMIT_FSIZE で指定されている値を超えました。指定されたファイルは、ファイルシステムがサポートするファイルサイズを超えているか、ファイル記述子のオフセット最大値を超えています。後述の「定義」で、「ファイル記述子」の項を参照してください。
デバイスに空き領域がありません
通常ファイルへの書き込みまたは ディレクトリエントリの作成を試みましたが、デバイス上に空き領域がありません。システム上にレコードエントリが残っていないので、fcntl(2) 関数によるファイル上のレコードロックの設定または削除ができませんでした。
シークが正しくありません。
lseek(2) 関数の呼び出しがパイプに対して発行されました。
読み取り専用のファイルシステムです。
読み取り専用でマウントされたデバイス上で、ファイルまたはディレクトリを更新しようとしました。
リンクが多すぎます。
LINK_MAX で指定されている値を超える数のリンクを作成しようとしました。
パイプが中断されました。
データを読み込むプロセスが存在しない パイプで書き込みを行おうとしました。この条件では、通常はシグナルが発行され、シグナルが無視されるとエラーが返されます。
数学引数が関数の領域定義域外です。
数学パッケージ (3M) 中の関数の引数が、その関数の定義域外です。
数学関数の結果を表示できません。
数学パッケージ (3M) 中の関数の結果の値は、このマシンの精度では表示できません。
要求された種類のメッセージがありません。
指定されたメッセージ待ち行列に存在しない種類のメッセージを受信しようとしました (msgrcv(2) を参照)。
識別子が削除されています。
このエラーは、ファイルシステムの名前空間から識別子が削除され、その結果、実行を再開するプロセスに対して返されます (msgctl(2)、semctl(2)、shmctl(2) を参照)。
チャネル番号が範囲外です。
レベル 2 が同期していません。
レベル 3 停止。
レベル 3 リセット。
リンク番号が範囲外です。
プロトコルドライバが装備されていません。
CSI 構造体がありません。
レベル 2 停止。
デッドロック状態。
デッドロック状態を検出したので回避しました。このエラーは、ファイルやレコードのロック処理に付随して発生します。また、相互排他ロック、セマフォ、条件付き変数、読み取り / 書き込みロックでも発生します。
レコードロックが使用できません。
使用可能なロックが存在しません。システムのロックテーブルがいっぱいです (fcntl(2) を参照)。
命令が取り消されました。
関連する非同期命令が、未完了のまま取り消されました。
サポートされていません。
このバージョンのシステムではこのサポートされていない機能です。将来のバージョンではサポートされる可能性があります。
ディスク容量の制限を超えました。
ユーザーに割り当てられたディスクブロックを使い果たしたため、通常ファイルへの write(2)、ディレクトリやシンボリックリンクの作成、ディレクトリエントリの作成に失敗しました。ユーザーに割り当てられた i ノードを使い果たしたため、新しく作成したファイルに i ノードを割り当てられなかった場合にも、同じエラーが発生します。
予約領域。
ストリームデバイスではありません。
STREAMS デバイスではないファイル記述子に対して、putmsg(2) または getmsg(2) システムコールを試みました。
データがありません。
タイマーが終了しました。
STREAMS の ioctl(2) コールに設定した時間が経過しました。このエラーの原因はデバイスによって異なり、ハードウェアまたはソフトウェアに障害が発生したか、設定した時間が要求した操作に対して短すぎたことが考えられます。ioctl() の処理状態は確定できません。_lwp_cond_timedwait(2) や cond_timedwait(3C) でも、同じエラーが返されます。
ストリーム資源が不足しています。
STREAMS の open(2) コールで、STREAMS 待ち行列または STREAMS ヘッドのデータ構造体を使用できませんでした。このエラー状態は一時的なもので、他のプロセスがリソースを解放すれば回復できる場合があります。
パッケージがインストールされていません。
インストールされていないパッケージのコールを使おうとしました。
プロトコルエラー。
何らかのプロトコルエラーが発生しました。このエラーはデバイス固有のものですが、通常、ハードウェアの障害とは関係がありません。
データメッセージではありません。
STREAMS デバイスへの read(2)、getmsg(2)、または ioctl(2) I_RECVFD コール中に、待ち行列の先頭に処理できない対象が置かれました。これは、次に示すようにコールによって異なります。
制御情報、または渡されたファイル記述子
渡されたファイル記述子
制御情報またはデータ情報
ファイル名が長すぎます。
パス引数の長さが PATH_MAX で指定されている最大長を超えているか、_POSIX_NO_TRUNC が有効であるのにパス名を構成する名前の 1 つが NAME_MAX で指定されている値より長すぎました。最大長については limits.h(3HEAD) を参照してください。
定義されたデータ型の値が大きすぎます。
同じ名前がネットワーク上に複数存在します。
指定されたログ名が、ネットワーク上で一意ではありません。
ファイル記述子が正しくありません。
ファイル記述子が開いたファイルを参照していないか、書き込み専用で開いたファイルに対して読み取り要求を発行しました。
リモートアドレスが変更されています。
必要な共有ライブラリにアクセスできません。
a.out の実行には共有静的ライブラリが必要ですが、ライブラリが 存在しませんでした。または、ユーザーには、そのライブラリを使用するアクセス権がありません。
共有ライブラリが壊れています。
a.out の実行には共有静的ライブラリが必要 (リンク対象) ですが、exec は、このライブラリを読み込めませんでした。ライブラリが壊れている可能性があります。
a.out ファイルの .lib 部分が壊れています。
a.out の実行には共有静的ライブラリが必要 (リンク対象) ですが、a.out 中の .lib 部分に不正なデータがありました。.lib 部分は、必要な共有ライブラリを exec に伝える役割を果たします。エラーの原因としては、a.out ファイルが壊れている可能性があります。
システムの限界数以上の共有ライブラリをリンクしようとしています。
実行しようとした a.out ファイルには、現在システムに定義されている許容最大値を超える数の共有ライブラリが必要です。詳細については、『Solaris のシステム管理 (IP サービス)』を参照してください。
共有ライブラリは直接実行 (exec) できません。
共有ライブラリを直接実行しようとしました。
不正なバイトシーケンスを検出しました。複数の文字を 1 文字として扱ってください。
適用不能な操作です。
パス名の走査中に見つかったシンボリックリンクの数が、MAXSYMLINKS で義されている値を超えました。
再開可能なシステムコールです。
割り込みを受けたシステムコールは再起動する必要があります。
パイプまたは先入れ先出し (FIFO) を使用している場合、ストリームヘッドでは休止できません。
ストリームのパイプエラーです。このエラーは外部からは見えません。
ディレクトリが空ではありません。
ユーザー数が多すぎます。
ソケットを対象とした操作がソケット以外に適用されました。
宛先のアドレスが必要です。
トランスポートの終端からの操作で、必要な宛先アドレスが省略されていました。
メッセージが長すぎます。
トランスポートプロバイダに送信されたメッセージの長さが、内部のメッセージバッファサイズまたはネットワーク上の制限値を超えていました。
プロトコルの型がソケット用ではありません。
指定されたプロトコルは、要求されたソケットタイプを解釈できません。
プトコルを使用できません。
プロトコルの取得、設定時に、不正なオプションまたはレベルが指定されました。
プロトコルがサポートされていません。
指定されたプロトコルがシステムに定義されていないか、そのプロトコル用の実装がありません。
ソケットの型がサポートされていません。
指定されたソケットがシステムに定義されていないか、そのソケット用の実装がありません。
トランスポートの終端でサポートされていない操作です。
たとえば、データグラムのトランスポートの終端で接続を受け付けようとした場合などに、このエラーが発生します。
プロトコルファミリがサポートされていません。
指定されたプロトコルファミリがシステムに定義されていません。またはないか、そのプロトコルファミリ用の実装がありません。この状態はインターネットプロトコルに適用されます。
プロトコルファミリがアドレスファミリをサポートしていません。
使用したアドレスには、要求されたプロトコルとの互換性ありません。
すでに使用されているアドスです。
現在使用中のアドレスを使用しようとしましたが、このような指定は、プロトコルで許可されていません。
要求されたアドレスを割り当てられません。
現在のマシン上に存在しないアドレスを使ってトランスポートの終端を作成しようとしました。
ネットワークがダウンしています。
指定した操作の実行中に、停止状態のネットワークを検出しました。
ネットワークに到達できません。
到達できないネットワークに対する操作を試みました。
リセットにより、ネットワーク接続がドロップされました。
接続先のホストに障害が発生し、リブートされました。
ソフトウェアによって接続が強制切断されました。
ホストマシン内部で、接続が異常終了しました。
相手側によって接続がリセットされました。
接続が、相手側から強制的に切断されました。通常この状態は、タイムアウトまたはリブートによりリモートホストとの接続が失われたときに発生します。
バッファ領域を用できません。
バッファ領域が不足しているか、待ち行列がいっぱいのため、トランスポートの終端またはパイプでの操作を実行できませんでした。
トランスポートの終端は接続されています。
すでに接続されているトランスポート終端に対して接続要求が発行されました。または、接続されているトランスポート終端上で、接続済みの宛先が指定された sendto(3SOCKET) または sendmsg(3SOCKET) 要求が発行されました。
トランスポートの終端が接続されていません。
トランスポートの終端が接続されていません。また、データグラム送信の場合、アドレスが指定されていません。このため、データの送信要求または受信要求を受け付けられません。
ソケットのシャットダウン後で送信できません。
トランスポート終端がシャットダウン済みなので、データ送信要求は受け付けられません。
参照が多すぎるため、結合できません。
接続の時間切れです。
相手側が一定時間内に正しい応答を返さなかったため、connect(3SOCKET) 要求または send(3SOCKET) 要求に失敗しました。soft オプションでマウントされた NFS ファイルシステム上にファイルが存在し、write(2) 要求または fsync(3C) 要求に失敗した場合も、同じエラーになります。
接続が拒否されました。
相手側マシンにより拒否されたので、接続を確立できませんでした。通常この状態は、リモートホスト上でアクティブになっていないサービスに接続しようとした場合に発生します。
ホストがダウンしています。
宛先ホストがダウンしているため、トランスポートプロバイダの処理に失敗しました。
ホストへの経路がありません。
到達不可能なホストに対して、トランスポートプロバイダの処理を試みました。
操作中です。
非ブロック型オブジェクトの処理を試みましたが、そのオブジェクトはすでに何らかの処理を実行中でした。
操作中です。
非ブロック型オブジェクトに対して、長時間を要する処理 (connect() など) を試みました。
NFS のファイルハンドルが無効です。
制御端末との接続を確立したセッションのフォアグラウンドプロセスグループを除くすべてのプロセスグループ。
制御端末との接続を確立したセッションリーダープロセス。
セッションで使用している端末。各セッションでは制御端末を 1 台だけ使用でき、制御端末 1 台で 1 つのセッションを確立できます。制御端末から入力されるある種のシーケンスは、その制御端末を使用しているセッション中のプロセスグループにシグナルを送信します。詳細については termio(7I) を参照してください。
ファイルを階層構造システムに組織化する働きを持つ、ファイル階層構造におけるノードです。ディレクトリもファイルの一種であり、一群のファイルや、すぐ下の階層にある他のディレクトリ (サブディレクトリ) をまとめています。また、ディレクトリファイル内の項目はリンクと呼ばれ、ファイル記述子とファイル名を対応付ける役割を果たしています。通常、各ディレクトリには 2 つのリンク、. (ドット) と .. (ドットドット) が含まれています。ドットはそのディレクトリ自体を指すリンクで、ドットドットはすぐ上の階層のディレクトリ (親ディレクトリ) を指すリンクです。階層構造の頂点にあるルートディレクトリの親ディレクトリは、そのディレクトリ自体です。ルートディレクトリのパス名は / で、親ディレクトリのパス名も / です。
ストリームの方向を表します。ストリームヘッドからドライバへの方向を、ダウンストリームと呼びます。
1 つのストリームでは、ドライバが周辺ハードウェア機器とストリームとのインタフェースを提供します。ドライバは、マルチプレクサやログドライバ (log(7D) を参照) のような擬似ドライバの形をとることもあります。疑似ドライバは、ハードウェアデバイスとは無関係です。
アクティブなプロセスは、実効ユーザー ID と実効グループ ID を 1 つずつ持っています。プロセスは、この 2 つの ID を使用して、ファイルへの アクセス権 (後述) を検査します。実効ユーザー ID と実効グループ ID は、それぞれ、プロセスの実ユーザー ID および実グループ ID と同一です。ただし、プロセスまたはその祖先がセットユーザー ID またはセットグループ ID のビットが設定されたファイル (exec(2) を参照) から生成されている場合を除きます。
次のいずれかの条件が満たされる場合、プロセスに、ファイルに対する読み取り権、書き込み権、実行権 / 検索権が付与されます。
プロセスの実効ユーザー ID がファイルの所有者のユーザー ID と一致していて、ファイルに 「所有者」モード (0700) のアクセスビットが設定されている場合
プロセスの実効ユーザー ID がファイルの所有者のユーザー ID と一致していなくても、プロセスの実効グループ ID または補助グループ ID がファイルのグループ ID と一致していて、ファイルに 「グループ」モード (0070) のアクセスビットが設定されている場合
プロセスの実効ユーザー ID がファイルの所有者のユーザー ID と一致せず、プロセスの実効グループ ID、補助グループ ID のどちらもファイルのグループ ID と一致しないが、ファイルに 「その他」モード (0007) のアクセスビットが設定されている場合
読み取り、書き込み、または実行のモードビットが設定されていないが、対応するモードビットを無効にするファイルアクセス無効可能特権をプロセスが持っている場合。つまり、読み取りビットに対しては {PRIV_FILE_DAC_READ}、書き込みビットに対しては {PRIV_FILE_DAC_WRITE}、ディレクトリの実行ビットに対しては {PRIV_FILE_DAC_SEARCH}、そして、プレーンファイルの実行ビットに対しては {PRIV_FILE_DAC_EXECUTE}。
上記の条件のいずれもあてはまらない場合、アクセスは拒否されます。
ファイルへの入出力の実行に使用する小さな整数値。最小値は 0 で、最大値は NOFILES の値から 1 を引いた値です。プロセスには、NOFILES 値を超える数のファイル記述子を同時に開くことは許可されていません。ファイル記述子は open(2) や pipe(2) などのコールにより返されます。また read(2)、write(2)、ioctl(2)、close(2) などのコールの引数として使用されます。
各ファイル記述子には、対応するオフセット最大値があります。O_LARGEFILE フラグを設定しないで開いた通常ファイルでは、オフセット最大値は 2 G バイトより 1 バイト小さい値 (231 –1 バイト) です。O_LARGEFILE フラグを設定して開いた通常ファイルでは、オフセット最大値は 263 バイトよりも 1 バイト小さい値です。
通常ファイル、特殊ファイル、ディレクトリに付与される名前。名前を構成する文字数の最小値は 1 で、最大値は NAME_MAX の値です。
ファイル名には、\0 (NULL) および / (スラッシュ) の ASCII コードを除くすべての文字を使用できます。
ただし、*、?、[、] の 4 文字は、シェルに対して特別な意味を持つため (sh(1)、csh(1)、ksh(1) を参照)、通常は使用しません。また、許可されている文字であっても、印刷できない文字は、できるだけ使用しないでください。
ファイル名は、パス名を構成する 1 項目とも考えられます。パス名の各項目の解釈は、その項目の接頭辞に対応した NAME_MAX および _POSIX_NO_TRUNC の値により異なります。このため、パス名に含まれている項目の長さが NAME_MAX 値を超えているとき、その項目のパス接頭辞に対して _POSIX_NO_TRUNC が有効な場合 (fpathconf(2) および limits.h(3HEAD) を参照)、この項目はエラーとみなされます。それ以外の場合、項目の先頭部分 (バイト数は NAME_MAX 値に等しい) が項目名として使用されます。
制御端末と接続を確立したセッションは、そのセッションのプロセスグループ群のうちの 1 つを制御端末のフォアグラウンドプロセスグループとして識別します。このプロセスグループは、制御端末にアクセスする際、他のグループ (バックグラウンドプロセスグループ) には許可されない特権を付与されています。
struct iovec 配列内の項目の最大数。
中括弧 {LIMIT} は、実装ごとに決められた大きさの制限を示すために使用されます。これは、{ } を使用せず、ヘッダーファイルによって定義される値、または、pathconf(2) に引数 _PC_LIMIT を指定して構成の照会を行うことによって実行時に得ることができる実際の値を示しています。
プロセスのファイルモード生成マスク。mode 引数で指定されたアクセス権ビットを無効にするような関数生成コール時に使用されます。umask (cmask) で設定されていたビットは、生成されるファイルのモードではクリアされています。
ストリーム中のデータまたは情報の集まり。ブロック単位で構成され、STREAMS 制御構造体を伴います。メッセージにはいくつかの形式が定義されていて、形式によってその内容の種類が決まります。ストリーム中では、メッセージがデータ送信および通信の唯一の手段です。
ストリーム中で、モジュールまたはドライバによる処理を待っているリンクされたメッセージ群。
msgget(2) コールによって生成される一意の正の整数で、メッセージを識別します。msqid とも表されます。各 msqid には、メッセージ待ち行列と、対応するデータ構造体が含まれています。データ構造体は msqid_ds と表され、次のメンバーからなります。
struct ipc_perm msg_perm; struct msg *msg_first; struct msg *msg_last; ulong_t msg_cbytes; ulong_t msg_qnum; ulong_t msg_qbytes; pid_t msg_lspid; pid_t msg_lrpid; time_t msg_stime; time_t msg_rtime; time_t msg_ctime;
次に、msqid_ds 構造体のメンバーについて説明します。
msg_perm メンバーは ipc_perm 構造体の 1 つであり、メッセージ操作用のアクセス権を指定します (後述)。この構造体には次のメンバーが含まれています。
uid_t cuid; /* creator user id */ gid_t cgid; /* creator group id */ uid_t uid; /* user id */ gid_t gid; /* group id */ mode_t mode; /* r/w permission */ ulong_t seq; /* slot usage sequence # */ key_t key; /* key */
*msg_first メンバーは、待ち行列内の先頭のメッセージへのポインタです。
*msg_last メンバーは、待ち行列内の最後のメッセージへのポインタです。
msg_cbytes メンバーは、現在の待ち行列の内容の総バイト数です。
msg_qnum メンバーは、現在待ち行列にあるメッセージの数です。
msg_qbytes メンバーは、待ち行列に置くことのできる最大バイト数です。
msg_lspid メンバーは、最後に msgsnd() を実行したプロセスのプロセス ID です。
msg_lrpid メンバーは、最後に msgrcv() を実行したプロセスのプロセス ID です。
msg_stime メンバーは、最後に msgsnd() を実行した時刻です。
msg_rtime メンバーは、最後に msgrcv() を実行した時刻です。
msg_ctime メンバーは、上記構造体のメンバーを変更する msgctl() を最後に実行した時刻です。
msgctl(2)、msgget(2)、msgrcv(2)、msgsnd(2) の各関数の説明では、操作に必要なアクセス権を {token} で表しています。この token は、必要なアクセス権の種類であり、次のように解釈されます。
00400ユーザーによる読み取り 00200ユーザーによる書き込み 00040グループによる読み取り 00020グループによる書き込み 00004その他による読み取り 00002その他による書き込み
次のいずれかの条件が満たされるとき、プロセスに、msqid への読み取りおよび書き込み権が付与されます。
プロセス特権が {PRIV_IPC_DAC_READ} または {PRIV_IPC_DAC_WRITE} を持っている場合
プロセスの実効ユーザー ID が msqid に対応するデータ構造体の msg_perm.cuid または msg_perm.uid と一致していて、msg_perm.mode の「ユーザー」部分 (0600) に正しいビットが設定されている場合
cr_gid および cr_groups の有効プロセスのグループ ID が msg_perm.cgid または msg_perm.gid と一致していて、msg_perm.mode の「グループ」部分 (060) に正しいビットが設定されている場合
msg_perm.mode の「その他」部分 (006) に正しいビットが設定されている場合
上記の条件がいずれもあてはまらない場合、アクセスは拒否されます。
データの入出力用の処理ルーチンの集まり。常にストリームの中間、つまりストリームヘッドからドライバまでの間に存在します。ストリームにおけるモジュールは、シェルのパイプラインにおけるコマンドと似ています。ただしモジュールには、双方向 (ダウンストリームとアップストリーム) のデータのフローと処理を独立して実施することを可能にするための 2 つの関数が含まれています。
複数のユーザープロセスに対応したストリーム群を 1 つのドライバに接続したり、複数のドライバを 1 つのユーザープロセスに接続することを可能にするドライバ。STREAMS は一般的な多重化用ドライバを備えてはいませんが、ストリームを構築したり多重化されたストリーム群を接続したりする機能は提供します。
オフセット最大値は、開いたファイルの記述の属性で、ファイルオフセットとして使用できる最大値を表します。
グループ内の全メンバーの親が、そのグループのメンバーか、グループのセッションのメンバーではないようなプロセスグループ。
スラッシュ (/) で区切られたディレクトリ名の集まりで、NULL 文字で終わる文字列。先頭がスラッシュの場合や、最後がファイル名の場合もあります。
パス名の先頭がスラッシュの場合、パスの検索はルートディレクトリから始まります。先頭がスラッシュでなければ、検索は現在の作業ディレクトリから始まります。
スラッシュ 1 つだけからなるパス名はルートディレクトリを指します。
特に指定されていない場合、NULL のパス名は、存在しないファイルを表すものと解釈されます。
Solaris ソフトウェアが実装する特権は、プロセスのアクションをきめ細やかに制御できます。ある特権を持っているプロセスは、特定の制限された操作を実行できます。Solaris 10 リリースより前までは、UID 0 で動作するプロセスには、すべての特権が付与されていました。実効 UID 0 を持つプロセスに付与される下位互換性の意味論と範囲については、privileges(5) を参照してください。
各プロセスは、存在している間 (寿命が終わるまで)、プロセス ID と呼ばれる一意の正の整数で認識されます。あるプロセス ID を割り当てた後、その ID を持つプロセス、プロセスグループ、セッションの寿命がすべて終わるまで、システムはその ID を再使用できません。プロセス内には thread_t、LWPID_t と呼ばれているスレッド ID を持つスレッドがあります。これらのスレッドは外部のプロセスからは見えません。
現在アクティブなプロセスが新しいプロセスを生成した場合 (fork(2) を参照)、現プロセスが新プロセスの親プロセスとなり、現プロセスのプロセス ID が親プロセス ID になります。
特権を持つということは、システムによる制限を受けずに操作する権利を持つことです。
システム中の各プロセスは、必ずあるプロセスグループのメンバーになっています。各グループはプロセスグループ ID によって認識されます。現在プロセスグループリーダーではないプロセスは、新しいグループを生成してそのグループのリーダーになることができます。また、現在プロセスグループリーダーではないプロセスは、同じセッション中の他の既存のプロセスグループに加わることができます。新しく生成されたプロセスは、その親プロセスが属するプロセスグループのメンバーになります。
プロセスグループ ID は、プロセスグループリーダーの ID と同一になります。
アクティブな各プロセスは、必ずあるプロセスグループのメンバーになっています。また、プロセスグループはプロセスグループ ID と呼ばれる正の整数によって認識されます。プロセスグループ ID は、そのグループのリーダーのプロセスのプロセス ID と同一になります。プロセスをグループ化することにより、関連したプロセス群に一括してシグナルを送信できます (kill(2) を参照)。
プロセスの寿命とは、フォークされたときから、終了したことを親プロセスが認識するまでの間を指します。wait(3C) を参照してください。
プロセスグループの寿命は、プロセスグループリーダーによってグループが生成されたときから、そのグループの最後のプロセスの寿命が終わるとき、または最後のプロセスがグループから離れるときまでを指します。
システムのプロセッサは、プロセッサセットとして知られるサブセットに分割できます。ある 1 つのプロセッサセットに結合されたプロセスは、そのプロセッサセット内のプロセッサ上でのみ動作し、またセット内のプロセッサは、通常、そのセットに結合されたプロセスだけを実行します。有効な各プロセッサセットは正の整数によって識別されます (pset_create(2) を参照)。
ストリーム内のモジュールまたはドライバ中のメッセージ待ち行列で、アップストリーム方向のメッセージを含んでいます。
システム上に存在することを許可されたユーザーは、実ユーザー ID と呼ばれる正の整数 (範囲は 0 から MAXUID の値まで) によって認識されます。
各ユーザーはグループのメンバーでもあります。各グループは、実グループ ID と呼ばれる正の整数によって認識されます。
アクティブなプロセスの実ユーザー ID と実グループ ID は、そのプロセスを生成したユーザーの実ユーザー ID と実グループ ID に設定されています。
パス名を検索するために、各プロセスにはルートディレクトリと現在の作業ディレクトリが対応付けられています。プロセスのルートディレクトリは、ルートファイルシステムのルートディレクトリと一致していなくてもかまいません。
保存されたリソース制限はプロセスの属性で、exec 関数群や setrlimit(2) で記述されるように、現在は有効でないリソース制限の処理を適用できるようにします。
保存されたユーザー ID と保存されたグループ ID の値は、セットユーザーまたはセットグループのファイルモードビットが設定されたファイルを実行した直後の実効ユーザー ID および実効グループ ID の値です (exec(2) を参照)。
セマフォ識別子 (semid) は、semget(2) コールによって生成される一意の正の整数です。各 semid は、一群のセマフォとそれに関連付けられたデータ構造体を持ちます。このデータ構造体は semid_ds と呼ばれ、次のメンバーから構成されます。
structipc_perm sem_perm; /* operation permission struct */ structsem *sem_base; /* ptr to first semaphore in set */ ushort_t sem_nsems; /* number of sems in set */ time_t sem_otime; /* last operation time */ time_t sem_ctime; /* last change time */ /* Times measured in secs since */ /* 00:00:00 GMT, Jan. 1, 1970 */
次に、semid_ds 構造体のメンバーについて説明します。
sem_perm メンバーは、セマフォ操作用アクセス権 (後述) を指定する ipc_perm 構造体であり、以下のメンバーを含んでいます。
uid_t uid; /* user id */ gid_t gid; /* group id */ uid_t cuid; /* creator user id */ gid_t cgid; /* creator group id */ mode_t mode; /* r/a permission */ ulong_t seq; /* slot usage sequence number */ key_t key; /* key */
sem_nsems メンバーは、そのセマフォ群に含まれているセマフォの数と同一になります。各セマフォは、sem_num と呼ばれる負ではない整数によって参照されます。sem_num の値の最小値は 0 で、最大値は sem_nsems の値から 1 を引いた値です。
sem_otime メンバーは、最後に semop(2) 動作を実行した時刻です。
sem_ctime メンバーは、上記構造体のメンバーを変更する semctl(2) を最後に実行した時刻です。
セマフォは、次のメンバーからなる sem という名前のデータ構造体です。
ushort_t semval; /* semaphore value */ pid_t sempid; /* pid of last operation */ ushort_t semncnt; /* # awaiting semval > cval */ ushort_t semzcnt; /* # awaiting semval = 0 */
次に、sem 構造体のメンバーについて説明します。
semval メンバーは、セマフォの実際の値に等しい 0 以上の整数です。
sempid メンバーは、このセマフォの操作を最後に実行したプロセスのプロセス ID です。
semncnt メンバーは、このセマフォの semval 値が現在の値より大きくなるまで待つように、中断状態に置かれているプロセス数です。
semzcnt メンバーは、このセマフォの semval 値が 0 になるまで待つように、中断状態に置かれているプロセス数です。
00400ユーザーによる読み取り 00200ユーザーによる変更 00040グループによる読み取り 00020グループによる変更 00004その他による読み取り 00002その他による変更
次のいずれかの条件が満たされるとき、プロセスに、semid の読み取りおよび変更権が付与されます。
プロセスが特権 {PRIV_IPC_DAC_READ} または {PRIV_IPC_DAC_WRITE} を持っている場合
プロセスの実効ユーザー ID が semid に対応するデータ構造体中の sem_perm.cuid または sem_perm.uid と一致していて、sem_perm.mode の「ユーザー」部分 (0600) に正しいビットが設定されている場合
プロセスの実効グループ ID が sem_perm.cgid または sem_perm.gid と一致していて、sem_perm.mode の「グループ」部分 (060) に正しいビットが設定されている場合
sem_perm.mode の「その他」部分 (06) に正しいビットが設定されている場合
上記の条件がいずれもあてはまらない場合、アクセスは拒否されます。
セッション ID と呼ばれる識別子によって認識される一群のプロセスで、制御端末との接続を確立する機能を持っています。現在プロセスグループリーダーではないプロセスは、新しいセッションとプロセスグループを生成することができます。このとき、生成元のプロセスは、新セッションのセッションリーダーになり、新プロセスグループのプロセスグループリーダーになります。新しく生成されたプロセスは、生成元のセッションのメンバーになります。
システム中の各セッションは、その寿命が終わるまで、セッション ID という一意の正の整数値によって認識されます。セッションリーダーのプロセス ID が、セッション ID になります。
プロセス ID、プロセスグループ ID は、セッションリーダーのセッション ID と同一になります。
セッションの寿命は、セッションリーダーによってセッションが開始されたときから、そのセッションの最後のプロセスの寿命が終わるとき、または最後のプロセスがセッションから離れるときまでを指します。
共有メモリー識別子 (shmid) は、shmget(2) コールによって生成される一意の正の整数です。各 shmid は、共有メモリーセグメントと呼ばれるメモリー領域と、対応するデータ構造体を持っています (ユーザーは、共有メモリーセグメントへの参照が終わったら、必ずそのセグメントを削除しなければなりません)。データ構造体は shmid_ds と呼ばれ、次のメンバーで構成されます。
struct ipc_perm shm_perm; /* operation permission struct */ size_t shm_segsz; /* size of segment */ struct anon_map *shm_amp; /* ptr to region structure */ char pad[4]; /* for swap compatibility */ pid_t shm_lpid; /* pid of last operation */ pid_t shm_cpid; /* creator pid */ shmatt_t shm_nattch; /* number of current attaches */ ulong_t shm_cnattch; /* used only for shminfo */ time_t shm_atime; /* last attach time */ time_t shm_dtime; /* last detach time */ time_t shm_ctime; /* last change time */ /* Times measured in secs since */ /* 00:00:00 GMT, Jan. 1, 1970 */
次に、shmid_ds 構造体のメンバーについて説明します。
shm_perm メンバーは、共有メモリー操作用アクセス権 (後述) を指定する ipc_perm 構造体であり、次のメンバーを含んでいます。
uid_tcuid;/* creator user id */ gid_tcgid;/* creator group id */ uid_tuid;/* user id */ gid_tgid;/* group id */ mode_tmode;/* r/w permission */ ulongseq;/* slot usage sequence # */ key_tkey;/* key */
shm_segsz メンバーは、共有メモリーセグメントのサイズをバイト単位で表しています。
shm_cpid メンバーは、この共有メモリー識別子を生成したプロセスのプロセス ID です。
shm_lpid メンバーは、最後に shmat() と shmdt() を実行したプロセスのプロセス ID です (shmop(2) を参照)。
shm_nattch メンバーは、このセグメントが現在接続されているプロセス数です。
shm_atime メンバーは、最後に shmat() を実行した時刻です (shmop(2) を参照)。
shm_dtime メンバーは、最後に shmdt() 動作を実行した時刻です (shmop(2) を参照)。
shm_ctime メンバーは、上記構造体のメンバーを変更する shmctl(2) を最後に実行した時刻です。
shmctl(2)、shmat()、shmdt() (shmop(2) を参照) の各関数の説明では、操作に必要なアクセス権を {token} で表しています。token は必要なアクセス権の種類であり、次のように解釈されます。
00400ユーザーによる読み取り 00200ユーザーによる書き込み 00040グループによる読み取り 00020グループによる書き込み 00004その他による読み取り 00002その他による書き込み
以下のいずれかの条件が満たされるとき、プロセスに、shmid の読み取りおよび書き込み権が付与されます。
プロセスが特権 {PRIV_IPC_DAC_READ} または {PRIV_IPC_DAC_WRITE} を持っている場合
プロセスの実効ユーザー ID が shmid に対応するデータ構造体中の shm_perm.cuid または shm_perm.uid と一致していて、shm_perm.mode の「ユーザー」部分 (0600) に正しいビットが設定されている場合
そのプロセスの実効グループ ID が shm_perm.cgid または shm_perm.gid と一致していて、shm_perm.mode の「グループ」部分 (060) に正しいビットが設定されている場合
shm_perm.mode の「その他」部分 (06) に正しいビットが設定されている場合
上記の条件がいずれもあてはまらない場合、アクセスは拒否されます。
プロセス ID の値が 0 または 1 のプロセスです (kill(2) を参照)。ID が 0 のプロセスは proc0 と呼ばれるプロセススケジューラです。ID が 1 のプロセスは proc1 と呼ばれる初期化プロセス (init) で、システム中の他のすべての プロセスの祖先であり、プロセス構造体の制御に使用されます。
カーネルメカニズムの集合体で、ネットワークドライバおよび通信ドライバの開発を支援します。STREAMS はカーネル内部と、カーネルおよびユーザーレベルのプロセスとの間で、文字の入出力に関するインタフェース基準を定義します。STREAMS メカニズムは、各種ユーティリティルーチン、カーネル機能、データ構造体から構成されます。
カーネル内におけるユーザープロセスとドライバルーチン間での全二重データパス。主な内容は、1 つのストリームヘッド、1 つのドライバ、そしてその両者の間に位置するいくつか (0 個の場合もある) のモジュールです。ストリームはシェルのパイプラインと似ていますが、データフローと処理が双方向に行われる点が異なります。
ストリームの両端のうち、ストリームとユーザープロセスとのインタフェースを提供する終端です。ストリームヘッドの主要な機能は、STREAMS に関連したシステムコールを処理することと、ストリームとユーザープロセス間でデータや情報を送信することです。
実効ユーザー ID の値が 0 のプロセス (スーパーユーザープロセス) に対応するユーザーです。スーパーユーザープロセスには、ファイルがアクセス権で保護されていてもアクセスできるなどの特権が与えられています。
ストリームの方向を表します。ドライバからストリームヘッドへの方向を、アップストリームと呼びます。
ストリーム内のモジュールまたはドライバ中のメッセージ待ち行列で、ダウンストリーム方向のメッセージを含んでいます。