INTRO(2) — NEWS-OS Programmer’s Manual
名称
intro − システムコールとエラー番号の紹介
形式
#include <sys/errno.h>
解説
このセクションでは、 すべてのシステムコールについて解説します。 これらのコールの大部分は、 1つまたは複数のエラーを 返します。 エラー状態は、 エラーが発生しなかった場合には返されることのないリターン値によって示されます。 この値は、 ほとんどの場合 −1 です。 詳細は個々のコールの説明で述べられています。 エラー番号の意味は システムコールによって変わり、 コールの種類と状況に従って解釈しなければならないことに注意してください。
通常の引数と同様に、 関数からのすべての戻りコードとリターン値は、 特にことわりのない限り整数型です。 エラー番号は、 外部変数 errno にも示されますが、 errno はコールが成功した場合にもクリアされません。 したがって、 エラーが発生したあとにのみ errno はテストされるべきです。
以下に示されているのは、 <sys/errno.h> で定義されているエラーとその名称の完全なリストです。
0 Error 0
未使用。
1 EPERM Not owner
通常、 このエラーは、 その所有者およびスーパーユーザ以外のユーザには禁止されている方法でファイルを 修正しようとしたことを 示す。 また、 普通のユーザがスーパーユーザだけに許されていることを 行おうとした場合にも返される。
2 ENOENT No such file or directory
このエラーは、 あるファイル名が指定され、 かつ、 そのファイルが実際には存在していない場合、 あるパス名に含まれているディレクトリのうちの 1つが存在していない場合に発生する。
3 ESRCH No such process
指定された番号のプロセスまたはプロセスグループが存在していない、 または、 そのようなプロセスは既に終了している。
4 EINTR Interrupted system call
システムコールの実行中に、 ユーザがキャッチしようとしていた(割り込みまたは中止などの) 非同期シグナルが生じた。 そのシグナルを 処理したあとで実行が再開され、 システムコールが再スタートされない場合には、 あたかもその割り込まれたシステムコールがこのエラー状態を 返したかのように見える。
5 EIO I/O error
read または write が行われているときに、 なんらかの物理的入出力エラーが発生した。 このエラーは、 場合によっては実際にこのエラーが適用されるべきコールのあとの コールで生じることもある。
6 ENXIO No such device or address
特殊ファイルでの入出力が、 存在していないサブデバイスを 指しているか、 またはそのデバイスの制限を 越えたアドレスを 指している。 このエラーは、 例えば、 認められていないテープドライブユニット番号が選択された場合や ディスクパックがドライブに装填されていない場合などにも発生する。
7 E2BIG Arg list too long
20480バイト(または現在の制限値である <sys/param.h> 内のNCARGS)より長い引数リストが execve に渡された。
8 ENOEXEC Exec format error
適切なパーミッションはあるが、 有効なマジック番号 (a.out(5) 参照)で始まっていないファイルを 実行する要求が出された。
9 EBADF Bad file number
ファイルディスクリプタがオープンされているファイルを 指していないか、 または書き込み(読み取り)のためにだけオープンされている ファイルに対して読み取り(書き込み)要求が出された。
10 ECHILD No children
wait が実行され、 そのプロセスが生きている子を 持っていないか、 待つことのできない子を 持っている。
11 EAGAIN No more processes
fork の実行で、 システムのプロセステーブルがいっぱいであるか、 またはそのユーザはそれ以上プロセスを 作成することが許されていない。
12 ENOMEM Not enough memory
execve または break の実行中に、 プログラムが、 システムが提供できる以上のコアまたはスワップスペースを 要求したか、 プロセスサイズの制限を オーバーする。 スワップスペースの不足は、 通常、 一時的な状態であるが、 コアの不足は一時的な状態ではない。 テキストおよび、 データ、 スタックセグメントの最大サイズは、 システムパラメタになっている。 ソフトリミットは、 それに対応するハードリミットまで増やすことができる。
13 EACCES Permission denied
保護システムによって禁じられている方法で ファイルへアクセスしようとした。
14 EFAULT Bad address
システムが、 あるシステムコールの引数へアクセスしようとして、 ハードウェア障害に遭遇した。
15 ENOTBLK Block device required
(例えば mount で)ブロック型デバイスが要求されているような場所で、 普通のファイルが指定された。
16 EBUSY Device busy
既にマウントされているデバイスを マウントしようとした、 またはアクティブなファイル(オープンされているファイル、 現ディレクトリ、 マウントされているファイル、 またはアクティブなテキストセグメント)があるデバイスを マウント解除しようとした。 既に使用されている排他的アクセスデバイスに対して要求が出された。
17 EEXIST File exists
既存のファイルが不適切な場所(例えば、 link) で宣言された。
18 EXDEV Cross-device link
別のデバイス上のファイルに対するハードリンクが試みられた。
19 ENODEV No such device
あるデバイスに不適切なシステムコールを 適用しようとした(例えば、 書き込み専用デバイスの読み取り)、 またはそのデバイスがシステムによってコンフィグレーションされていない。
20 ENOTDIR Not a directory
ディレクトリが必要とされている場所に、 (例えば、 パス名の中や chdir への引数として)ディレクトリ以外のものが指定された。
21 EISDIR Is a directory
ディレクトリに対して書き込みを 行おうとした。
22 EINVAL Invalid argument
なんらかの無効な引数(マウントされていないデバイスを マウント解除する引数、 signal で未知のシグナルを 指している引数、 またはコールに不適切なその他の引数)が与えられた。 これは、 数学関数によってもセットされる (math(3) 参照)。
23 ENFILE File table overflow
システムのオープンファイルのテーブルがいっぱいで、 一時的にそれ以上の open を 受け入れることができない。
24 EMFILE Too many open files
NEWS-OSでは、 1プロセス当りのオープンファイルの数は 64 までに制限されている。 getdtablesize(2) を 用いると、 現在の制限値を 取り出すことができる。 他の多くのUNIXシステムでは、 1プロセス当りのオープンファイルの数は 20 までに制限されている。
25 ENOTTY Inappropriate ioctl for device
ioctl 内で宣言されているファイルが、 端末装置ではないか、 このコールの適用されるデバイスのうちの 1つではない。
26 ETXTBSY Text file busy
書き込みのために現在オープンされている純プロシージャプログラムを 実行しようとした。 または、 実行中の純プロシージャプログラムを 書き込みのためにオープンしようとした。
27 EFBIG File too large
ファイルのサイズが最大値(約 231 バイト)を オーバーした。
28 ENOSPC No space left on device
ファイルシステム上で、 それ以上のディスクブロックが使用可能ではないために、 普通のファイルへの write、 ディレクトリまたはシンボリックリンクの作成、 もしくはディレクトリエントリの作成が失敗した。 または、 ファイルシステム上で、 それ以上のiノードが使用可能ではないために、 新しく作成されるファイルのためのiノードの割り当てが失敗した。
29 ESPIPE Illegal seek
ソケットまたはパイプに対して lseek が発行された。 このエラーは、 他のシーク可能ではないデバイスの場合にも発生することがある。
30 EROFS Read-only file system
読み取り専用でマウントされているデバイスに対してファイルまたは ディレクトリの修正を行おうとした。
31 EMLINK Too many links
1個のファイルへ 32767 を 超えるハードリンクを 作ろうとした。
32 EPIPE Broken pipe
データを 読み取るプロセスがないパイプまたはソケットに対する書き込み。 この状態は、 通常、シグナルを生成する。 そのシグナルがキャッチまたは無視された場合に、 このエラーが返される。
33 EDOM Argument too large
数学パッケージ (3M)に含まれている 関数の引数が、 その関数の定義域外にある。
34 ERANGE Result too large
数学パッケージ (3M)に含まれている 関数の値が、 マシンの精度内では表現不可能である。
35 EWOULDBLOCK Operation would block
ブロッキングモードでないオブジェクトに対して、 プロセスにブロックさせるオペレーションが試みられた(fcntl(2)参照)。
36 EINPROGRESS Operation now in progress
ブロッキングモードでないオブジェクトに対して、 (connect(2)のような)完了するまでに長い時間を 要するオペレーションが試みられた (fcntl(2)参照)。
37 EALREADY Operation already in progress
あるオペレーションが既に進行中であるブロッキングモードでない オブジェクトに対して、オペレーションが試みられた。
38 ENOTSOCK Socket operation on non-socket
ソケットでないオブジェクトに対してソケットオペレーションが試みられた。
39 EDESTADDRREQ Destination address required
ソケットでのオペレーションで、 必要とされるアドレスが指定されなかった。
40 EMSGSIZE Message too long
ソケットへ送られたメッセージが、 内部メッセージバッファまたは他のなんらかのネットワークの制限値より大きかった。
41 EPROTOTYPE Protocol wrong type for socket
要求されたソケットタイプを サポートしていないプロトコルが指定された。 例えば、 タイプ SOCK_STREAMでARPA インターネットの UDPプロトコルを 使用することはできない。
42 ENOPROTOOPT Option not supported by protocol
getsockopt(2) または setsockopt(2) コールで、 誤ったオプションまたはレベルが指定された。
43 EPROTONOSUPPORT Protocol not supported
そのプロトコルは、 システムにコンフィグレーションされていない、 またはまだ実現されていない。
44 ESOCKTNOSUPPORT Socket type not supported
そのソケットタイプのサポートは、 システムにコンフィグレーションされていない、 またはまだ実現されていない。
45 EOPNOTSUPP Operation not supported on socket
例えば、 datagram ソケット上のコネクションを accept しようとした。
46 EPFNOSUPPORT Protocol family not supported
そのプロトコルファミリは、 システムにコンフィグレーションされていない、 またはまだ実現されていない。
47 EAFNOSUPPORT Address family not supported by protocol family
要求されたプロトコルに適合しないアドレスが使用された。 例えば、 ARPAインターネットのプロトコルで NS のアドレスを 使用することはできない。
48 EADDRINUSE Address already in use
各アドレスは、 通常、 一度だけの使用が許される。
49 EADDRNOTAVAIL Can’t assign requested address
このエラーは、 通常、 そのマシン上にはないアドレスを 用いてソケットを 作成しようとした場合に発生する。
50 ENETDOWN Network is down
ダウンしているネットワークに対してソケットオペレーションが試みられた。
51 ENETUNREACH Network is unreachable
到達できないネットワークに対してソケットオペレーションが試みられた。
52 ENETRESET Network dropped connection on reset
ユーザのコネクトされていたホストがクラッシュし、 リブートされた。
53 ECONNABORTED Software caused connection abort
使用しているホストマシンの内部でコネクトの中断が引き起こされた。
54 ECONNRESET Connection reset by peer
コネクトがコネクトしている先によって強制的にクローズされた。 このエラーは、 通常、 時間切れまたはリブートのためリモートソケットへのコネクションが失われた場合に 発生する。
55 ENOBUFS No buffer space available
システムにスペースが不足していたために、 またはキューがいっぱいであったために、 ソケットまたはパイプに対するオペレーションが実行されなかった。
56 EISCONN Socket is already connected
既にコネクトされているソケットに対して connect 要求が出された。 または、 コネクトされているソケットに対する sendto または sendmsg 要求が、 既にコネクトされている場合にデスティネーションを 指定した。
57 ENOTCONN Socket is not connected
ソケットがコネクトされてなく、 (datagram ソケットでデータを 送るときに)アドレスが与えられていなかったために、 データの送信または受信要求が拒否された。
58 ESHUTDOWN Can’t send after socket shutdown
ソケットが前に実行された shutdown(2) によって既にシャットダウンされていたために、 データの送信要求が拒否された。
59 未使用
60 ETIMEDOUT Connection timed out
コネクトしている先が一定時間内に正しく応答しなかったために、 connect または send 要求が失敗した(このタイムアウト時間は、 通信プロトコルによって違う)。
61 ECONNREFUSED Connection refused
ターゲットマシンがコネクトを拒絶したために、 コネクトを確立することができなかった。 このエラーは、 通常、外部ホストでアクティブになっていないサービスへコネクトを 行おうとした場合に発生する。
62 ELOOP Too many levels of symbolic links
パス名のサーチで、 8個より多くのシンボリックリンクがあった。
63 ENAMETOOLONG File name too long
パス名の 1要素が 255(MAXNAMELEN) バイトを 超えていた、 またはパス名全体が 1023(MAXPATHLEN−1) バイトを 超えていた。
64 EHOSTDOWN Host is down
宛先のホストがダウンしていたために、 ソケットオペレーションが失敗した。
65 EHOSTUNREACH Host is unreachable
到達不可能なホストに対してソケットオペレーションが試みられた。
66 ENOTEMPTY Directory not empty
“.” および “..”以外のエントリを 有するディレクトリが、 ディレクトリの除去またはリネームコールへ与えられた。
69 EDQUOT Disc quota exceeded
そのユーザのディスクブロックの割り当て量が使い果たされているために、 普通のファイルへの write、 ディレクトリ、シンボリックリンクの作成、 もしくはディレクトリエントリの作成が失敗した。 または、 そのユーザのiノードの割り当て量が使い果たされているために、 新しく作成されるファイルのためのiノードの割り当てが失敗した。
定義
プロセスID
システム内のアクティブな各プロセスは、 プロセスIDと呼ばれる正の整数によって一意に識別されます。 このIDの範囲は 0 から 30000 までです。
親プロセスID
現アクティブプロセスによって新しいプロセスが作成されます (fork(2) 参照)。 あるプロセスの親プロセスIDは、 それを 作成したプロセスのプロセスIDです。
プロセスグループID
アクティブな各プロセスは、 プロセスグループIDと呼ばれる正の整数によって識別される プロセスグループのメンバになっています。 これは、 グループリーダのプロセスIDです。 このグルーピングによって、 関連するプロセス間でのシグナルのやりとり (killpg(2) 参照)および csh(1) のジョブ制御メカニズムが可能になっています。
ttyグループID
アクティブな各プロセスは、 tty グループIDと呼ばれる正の整数によって識別される端末装置グループの メンバになることができます。 このグルーピングは、 同じ端末装置を 取り合っている複数のジョブを 調停するために使用されます。 (csh(1) と tty(4) を 参照してください。 )
実ユーザIDと実グループID
システムの各ユーザは、 実ユーザIDと呼ばれる正の整数によって識別されます。
また、 各ユーザは 1つまたは複数のグループのメンバになっています。 これらのグループの1つは、 他のグループとは区別され、 アカウンティング機能の実現で使用されます。 区別された各グループに対応する正の整数が実グループIDと呼ばれています。
すべてのプロセスは、 実ユーザIDと実グループIDを 持っています。 これらは、 そのプロセスを 作成したプロセスと同じ属性を 用いて初期設定されます。
有効ユーザID、
有効グループID、 およびアクセスグループ
システムリソースへのアクセスは、 有効ユーザID、 有効グループID、 およびグループアクセスリストの3つの値によって決定されます。
有効ユーザIDと有効グループIDは、 当初は、 それぞれそのプロセスの実ユーザIDと実グループIDです。 (可能であればその先祖の1つによる)セットユーザIDまたは セットグループIDファイルの実行を通して、 どちらも修正することができます (execve(2) 参照)。
グループアクセスリストは、 リソースに対するアクセスの可能性の判定だけで使用される、 グループIDの付加的なリストです。 アクセスのチェックは、 あとの“ファイルのアクセスパーミッション”で述べられているように実施されます。
スーパーユーザ
プロセスは、 その有効ユーザIDが 0 である場合には、 スーパーユーザ プロセスとして認識され、 特別な権限が与えられます。
特殊プロセス
0、1、2 のプロセスIDを 有するプロセスは特殊です。 プロセス 0 は、 スケジューラです。 プロセス1は、 初期設定プロセス init であり、 システム内の他のすべてのプロセスの親です。 これは、 プロセス構造を 制御するために使用されます。 プロセス 2 は、 ページングデーモンです。
ディスクリプタ
ファイルが open(2) または dup(2) によって参照されるとき、 またはソケットが pipe(2) または、 socket(2)、 socketpair(2) によって作成されるときにシステムによって割り当てられる整数で、 そのファイルまたはソケットへのアクセスパスを 一意に識別します。
ファイル名
255(MAXNAMELEN) バイトまでの文字で構成される名前は、 普通のファイル、 特殊ファイル、 またはディレクトリの命名に使用することができます。
これらのキャラクタは、 0(ナル)、0xff、/(スラッシュ)を 除く任意のキャラクタを使用できます。 そのためどんな漢字コードも使えます。
∗ または、?、[、] は、 シェルによって特別な意味が与えられるので、 ファイル名の一部にこれらのキャラクタを 使用することは避けたほうがよいことに注意してください。
パス名
パス名は、 省略可能なスラッシュ(/)で始まり、 ナルで終了する文字列であり、 このスラッシュのあとには、 スラッシュで区切られたゼロ個以上のディレクトリ名が続きます。 さらに、 そのあとにファイル名が続くこともあります。 パス名の全体の長さは、 1023(MAXPATHLEN) バイト以下でなければなりません。
パス名がスラッシュで始まっている場合には、 パスサーチは root ディレクトリから開始されます。 そうでない場合には、 サーチは現在のワーキングディレクトリから始まります。 先頭のスラッシュは、 それ自体でルートディレクトリを 表しています。 ナルのパス名は現ディレクトリを 指します。
ディレクトリ
ディレクトリは、 他のファイルを 指すエントリが収められている特殊なタイプのファイルです。 ディレクトリのエントリはリンクと呼ばれています。 規約では、 ディレクトリには、 少なくとも 2つのリンク、“.”および“..”、 が収められていなければなりません。 “.”および“..”は、 それぞれ ドット および ドットドット と呼ばれます。 ドットは、 ディレクトリ自体を 指し、 ドットドットは、 その親ディレクトリを 指します。
ルートディレクトリと現在のワーキングディレクトリ
パス名のサーチを 解決するために、 各プロセスには、 ルートディレクトリと現在のワーキングディレクトリという概念があります。 プロセスのルートディレクトリは、 ルートファイルシステムのルートディレクトリである必要はありません。
ファイルのアクセスパーミッション
システムファイル内のすべてのファイルは、 1組のアクセスパーミッションを 持っています。 これらのパーミッションは、 プロセスが(書き込みのためにファイルを オープンするといったような)要求されたオペレーションを、 そのファイルに対して遂行できるかどうかの判定で使用されます。 アクセスパーミッションは、 ファイルの作成時に確立されます。 これらのパーミッションは、 chmod(2) コールを 用いて、 あとで修正することができます。
ファイルのアクセスは、 そのファイルが、 読み取り、 書き込み、 または実行できるかどうかによって分類されます。 ディレクトリファイルは、 そのディレクトリがサーチできるかどうかを コントロールするために、 実行パーミッションを 使用します。
システムは、 ファイルのアクセスパーミッションは、 そのファイルの所有者、 そのファイルのグループに属しているユーザ、 その他のユーザの3種類の異なるクラスのユーザに適用されると解釈します。 すべてのファイルは、 これらのクラスの各々についてアクセスパーミッションの独自の集まりを 持っています。 アクセスチェックを 行う場合、 システムは、 呼び出しユーザに適用できるアクセス情報を チェックすることによって、 パーミッションを 与えるべきかどうかを 判定します。
ファイルについての読み取り、 書き込み、 および実行/サーチパーミッションは、 次のような場合にプロセスに与えられます。
そのプロセスの有効ユーザIDがスーパーユーザのものである場合。
そのプロセスの有効ユーザIDがそのファイルの所有者のユーザIDと一致し、 かつ、 その所有者のパーミッションがアクセスを 許している場合。
そのプロセスの有効ユーザIDは、 そのファイルの所有者のユーザIDとは一致していないが、 そのプロセスの有効グループIDがそのファイルのグループIDに一致しているか、 またはそのファイルのグループIDがそのプロセスのグループアクセスリストにあり、 そのグループのパーミッションがアクセスを 許している場合。
有効ユーザIDも、 そのプロセスの有効グループIDおよびグループアクセスリストも、 それぞれ対応するそのファイルのユーザIDとグループIDには一致していないが、 “その他のユーザ”のためのパーミッションがアクセスを 許している場合。
上記以外の場合、 パーミッションは否定されます。
ソケットとアドレスファミリ
ソケットはプロセス間通信の1つの入口を示すものです。 各ソケットは、 送信および受信データのためのキューを 持っています。
ソケットは、 その通信の特性に従って分類されます。 これらの特性には、 ソケットで送信および受信されるメッセージが相手の名前を 必要とするかどうか、 通信が信頼性の高いものであるかどうか、 メッセージの受取先の指定で使用されるフォーマットなどが含まれています。
各システムでは、 いくつかのソケットタイプがサポートされています。 使用可能なタイプおよびそれらの特性に関する詳しい情報については、 socket(2) を 参照してください。
各システムでは、 いくつかの通信プロトコルがサポートされています。 各プロトコルセットは、 一定のフォーマットのアドレスを サポートしています。 1つのアドレスファミリは、 プロトコルのある特定のグループのためのアドレスの集まりです。 各ソケットは、 そのソケットが作成されたアドレスファミリから選ばれた 1つのアドレスを 持ちます。
メッセージキュー識別子
メッセージキュー識別子 (msqid) は msgget(2) システムコールによって作られるユニークな正の整数です。 それぞれの msqid はメッセージキューと関連したデータ構造体を持っています。 データ構造体は msqid_ds として参照され、次のメンバを持っています。
structipc_perm msg_perm;/∗ 操作権の構造体 ∗/
ushortmsg_qnum;/∗ キュー内のメッセージの数 ∗/
ushortmsg_qbytes;/∗ キュー内のバイト数の最大値 ∗/
ushortmsg_lspid;/∗ 最後に msgsnd を行った pid ∗/
ushortmsg_lrpid;/∗ 最後に msgrcv を行った pid ∗/
time_tmsg_stime;/∗ 最後の msgsnd の時刻 ∗/
time_tmsg_rtime;/∗ 最後の msgrcv の時刻 ∗/
time_tmsg_ctime;/∗ 最後の変更時刻 ∗/
/∗ 時間は ∗/
/∗ 00:00:00 GMT, Jan. 1, 1970 ∗/
/∗ からの秒単位で計測される ∗/
Msg_perm は ipc_perm 構造体で、 以下に示すメッセージの操作権を規定します。 この構造体は次のメンバを持っています。
ushortcuid;/∗ 作成者のユーザ ID ∗/
ushortcgid;/∗ 作成者のグループ ID ∗/
ushortuid;/∗ ユーザ ID ∗/
ushortgid;/∗ グループ ID ∗/
ushortmode;/∗ リード/ライト権 ∗/
Msg_qnum は現在キューにあるメッセージの数です。 Msg_qbytes はキューに置くことができるバイト数の最大値です。 Msg_lspid は最後に msgsnd を行ったプロセスのプロセス ID です。 Msg_lrpid は最後に msgrcv を行ったプロセスのプロセス ID です。 Msg_stime は最後の msgsnd の時刻です。 msg_rtime は最後の msgrcv の時刻です。 msg_ctime は最後に msgctl(2) によって上記の構造体のメンバが変更された時刻です。
メッセージの操作権
msgop(2) と msgctl(2) システムコールの説明で、 操作を行うことのできる権限は "{token}" として示されています。 ここで、"token" とは次のように解釈される権限です。
00400 ユーザによる読み出し
00200 ユーザによる書き込み
00060 グループによる読み書き
00006 その他による読み書き
msqid に対するプロセスの読み書きの権限は、 次のうち少なくともひとつが当てはまれば与えられます。
プロセスの実効ユーザ ID がスーパーユーザである。
プロセスの実効ユーザ ID が msqid に対応するデータ構造体の msg_perm.[c]uid に等しく、 msg_perm.mode の “user” 部分 (0600) の対応するビットが 1 である。
プロセスの実効ユーザ ID が、 msg_perm.[c]uid に等しくなく、 実効グループ ID が msg_perm.[c]gid に等しく、 msg_perm.mode の “group” 部分 (060) の対応するビットが 1 である。
プロセスの実効ユーザ ID が、 msg_perm.[c]uid に等しくなく、 実効グループ ID が msg_perm.[c]gid に等しくなく、 msg_perm.mode の “other” 部分 (06) の対応するビットが 1 である。
その他の場合は、その権限は認められません。
セマフォ識別子
セマフォ識別子 (semid) は semget(2) システムコールによって作られる ユニークな正の整数です。 それぞれの simid はセマフォのセットと関連するデータ構造体を持っています。 データ構造体は semid_ds として参照され、次のメンバを持っています。
structipc_perm sem_perm;/∗ 操作権の構造体 ∗/
ushortsem_nsems;/∗ セット中のセマフォの数 ∗/
time_tsem_otime;/∗ 最後のセマフォ操作の時刻 ∗/
time_tsem_ctime;/∗ 最後に変更された時刻 ∗/
/∗ 時間は ∗/
/∗ 00:00:00 GMT, Jan. 1, 1970 ∗/
/∗ からの秒単位で計測される ∗/
Sem_perm は ipc_perm 構造体で、 以下に示すセマフォの操作権を規定します。 この構造体は次のメンバを持っています。
ushortcuid;/∗ 作成者のユーザ ID ∗/
ushortcgid;/∗ 作成者のグループ ID ∗/
ushortuid;/∗ ユーザ ID ∗/
ushortgid;/∗ グループ ID ∗/
ushortmode;/∗ リード/変更権 ∗/
Sem_nsems はセット中のセマフォの数です。 セット中のセマフォは sem_num. と呼ばれる正の整数で参照されます。 Sem_num は 0 から sem_nsems−1 までの値を取ります。 Sem_otime は、最後に semop(2) が行われた時刻で、 sem_ctime は最後に、 semctl(2) によって、上記の構造体のメンバが変更された時刻です。
セマフォは次のメンバを持ったデータ構造体です。
ushortsemval;/∗ セマフォの値 ∗/
shortsempid;/∗ 最後に操作を行った pid ∗/
ushortsemncnt;/∗ semval > cval 待っているプロセスの数 ∗/
ushortsemzcnt;/∗ semval = 0 を待っているプロセスの数 ∗/
Semval は負でない整数です。 Sempid は最後にこのセマフォに対して操作を行ったプロセスのプロセス ID です。 Semncnt はこのセマフォの semval の値が現在の値より大きくなるのを待って 実行を停止しているプロセスの数です。 Semzcnt はこのセマフォの semval の値が 0 になるのを 待って実行を停止しているプロセスの数です。
セマフォの操作権
Semop(2) and semctl(2) システムコールの説明の中で、 操作を行うことのできる権限は "{token}" として示されています。 ここで、"token" とは次のように解釈される権限です。
00400 ユーザによる読み出し
00200 ユーザによる変更
00060 グループによる読み出し/変更
00006 その他による読み出し/変更
Semid に対するプロセスの読み出し/変更の権限は、 次のうち少なくともひとつが当てはまれば与えられます。
プロセスの実効ユーザ ID がスーパーユーザである。
プロセスの実効ユーザ ID が semid に対応するデータ構造体の sem_perm.[c]uid に等しく、 sem_perm.mode の “user” 部分 (0600) の対応するビットが 1 である。
プロセスの実効ユーザ ID が sem_perm.[c]uid と等しくなく、 実効グループ ID が sem_perm.[c]gid と等しく、 sem_perm.mode の “group” 部分 (060) の対応するビットが 1 である。
プロセスの実効ユーザ ID が、 sem_perm.[c]uid と等しくなく、 実効グループ ID が sem_perm.[c]gid と等しくなく、 sem_perm.mode の “other” 部分 (06) の対応するビットが 1 である。
その他の場合は、その権限は認められません。
共有メモリ識別子
共有メモリ識別子 (shmid) は shmget(2) システムコールで作られるユニークな正の整数です。 それぞれの shmid は共有メモリセグメントとよばれるメモリと、 関連するデータ構造体を持っています。 データ構造体は、 shmid_ds と呼ばれ、次のメンバを持っています。
structipc_perm shm_perm;/∗ 操作権の構造体 ∗/
intshm_segsz;/∗ セグメントのサイズ ∗/
ushortshm_cpid;/∗ 作成者の pid ∗/
ushortshm_lpid;/∗ 最後に操作した pid ∗/
shortshm_nattch;/∗ アタッチされている数 ∗/
time_tshm_atime;/∗ 最後にアタッチされた時刻 ∗/
time_tshm_dtime;/∗ 最後にデタッチされた時刻 ∗/
time_tshm_ctime;/∗ 最後に変更された時刻 ∗/
/∗ 時間は ∗/
/∗ 00:00:00 GMT, Jan. 1, 1970 ∗/
/∗ からの秒単位で計測される ∗/
Shm_perm は ipc_perm 構造体で、 以下に示すセマフォの操作権を規定します。 この構造体は次のメンバを持っています。
ushortcuid;/∗ 作成者のユーザ ID ∗/
ushortcgid;/∗ 作成者のグループ ID ∗/
ushortuid;/∗ ユーザ ID ∗/
ushortgid;/∗ グループ ID ∗/
ushortmode;/∗ リード/ライト権 ∗/
Shm_segsz は共有メモリのサイズを示します。 Shm_cpid は共有メモリ識別子を作成したプロセスのプロセス ID です。 Shm_lpid は最後に shmop(2) を行ったプロセスのプロセス ID です。 Shm_nattch は現在このセグメントをアタッチしているプロセスの数です。 Shm_atime は最後に shmat された時刻です。 shm_dtime は最後に shmdt された時刻です。 shm_ctime は最後に shmctl(2) によって上記の構造体のメンバが変更された時刻です。
共有メモリの操作権
Shmop(2) and shmctl(2) システムコールの説明の中で、 操作を行うことのできる権限は "{token}" として示されています。 ここで、"token" とは次のように解釈される権限です。
00400 ユーザによる読み出し
00200 ユーザによる書き込み
00060 グループによる読み書き
00006 その他による読み書き
Shmid に対する読み書きの権限は 次のうちひとつ以上が当てはまればプロセスに与えられます。
プロセスの実効ユーザ ID がスーパーユーザである。
プロセスの実効ユーザ ID が shmid に対応したデータ構造体の shm_perm.[c]uid に等しく、 shm_perm.mode の “user” 部分 (0600) の対応するビットが 1 である。
プロセスの実効ユーザ ID が shm_perm.[c]uid に等しくなく、 実効グループ ID が shm_perm.[c]gid に等しく、 shm_perm.mode の “group” 部分 (060) の対応するビットが 1 である。
プロセスの実効ユーザ ID が shm_perm.[c]uid に等しくなく、 実効グループ ID が shm_perm.[c]gid に等しくなく、 shm_perm.mode の “othter” 部分の対応するビットが 1 である。
その他の場合は、その権限は認められません。
関連事項
NEWS-OSRelease 4.1C