SHMOP(2)

名前
shmop - 共有メモリ(shared memory)の操作

書式
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>

char *shmat ( int shmid, char *shmaddr, int shmflg )

int shmdt ( char *shmaddr)

説明
shmat 関数は shmid で指定された共有メモリ・セグメント(shared memory segment)を コールしたプロセスのデータ・セグメントに付加(attach)する。 付加するアドレスは shmaddr に以下のどれか形式で指定する:

    shmaddr が 0 ならば、システムは 1 - 1.5G の範囲で高い値から始めて低い値へと、 マップ(map)されていない領域を見つけようと試みる。

    shmaddr が 0 でなく SHM_RND が shmflg に指定されている場合は、 shmaddr を SHMLBA の倍数へと切り捨てた(rounding donw)のと等しいアドレスへ付加を行なう。 その他の場合は shmaddr は付加を行なうアドレスで、ページ境界(aligne)に合わせてなければならない。

もし SHM_RDONLY が shmflg に指定されていた場合は、 セグメントは読み込み専用に付加され、プロセスはそのセグメントへの 読み込み許可を持たなければならない。 そうでなければそのセグメントは読み込みと書き込みのために付加され、 プロセスはそのセグメントに読み込みと書き込みの許可を持つ必要がある。 書き込み専用の共有メモリ・セグメントという概念は存在しない。

呼び出したプロセスの brk の値は付加によって変化しない。 そのセグメントはプロセスが終了(exit)したら自動的に分離(detach)される。 同じセグメントをプロセスのアドレス空間に、読み込み専用および読み書き両用 として付加できるし、複数回付加することもできる。

成功した shmat コールは共有メモリ・セグメントに関連する shmid_ds 構造体のメンバーを以下のように更新する:

    shm_atime には現在の時刻を設定する。

    shm_lpid には呼び出したプロセスのプロセス ID を設定する。

    shm_nattch を1増加させる。

共有メモリ・セグメントに削除(delete)マークがある場合も 付加に成功することに注意すること。

shmdt 関数は呼び出したプロセスのデータ・セグメントから shmaddr で指定されたアドレスに配置された共有メモリ・セグメントを 分離(detach)する。 分離する共有メモリ・セグメントは現在、(プロセスのアドレス空間に) 付加されているもの中のどれかでなければならず、 shmaddr はそれを付加した時の shmat が返した値に等しくなければならない。

成功した shmdt コールはその共有メモリ・セグメントに関連する shmid_ds 構造体のメンバーを以下のように更新する:

    shm_dtime には現在の時刻が設定される。

    shm_lpid には呼び出したプロセスのプロセス ID が設定される。

    shm_nattch を 1減少させる。もし 0 になり、削除マークがあった場合は そのセグメントは削除される。

呼び出したプロセスのユーザー空間に占めていた領域はアンマップ(unmap) される。

システム・コール

fork()
    fork() した後、子プロセスは付加された共有メモリ・セグメントを継承する。

exec()
    exec() した後、全ての付加された共有メモリ・セグメントは分離される。 (破壊はされない。)

exit()
    exit() において、全ての付加された共有メモリ・セグメントは分離される。

返り値
失敗した場合にはどちらの関数も -1 を返し、 errno にエラーを指摘する、 そうでなれば shmat は付加された共有メモリ・セグメントのアドレスを返し、 shmdt は 0 を返す。

エラー
shmat が失敗した場合、 errno に以下の値のどれかを設定して返す:

EACCES
    呼び出したプロセスに要求された種類の付加に必要なアクセス許可がない。

EINVAL
    shmid の値が不正である、境界違反(unaligned)(例えば、ページ境界に合っておらず、 SHM_RND が指定されていない。) または shmaddr が不正である、または brk への付加に失敗した。

ENOMEM
    ディスクリプター(descriptor)やページ・テーブルのためのメモリを 割り当てることができない。。

shmdt 関数は shmaddr に付加された共有メモリ・セグメントが存在しない場合のみ失敗し、 そのような場合には errno に EINVAL が設定される。

注意
fork(2) システム・コールを実行する場合、 子プロセスは全ての付加された共有メモリ・セグメントを継承する。

execve(2) システム・コールを実行する場合にプロセスに付加されていた 共有メモリ・セグメントは、結果のプロセスには付加されていない。

以下は shmat システム・コールに影響するシステム・パラメーターである:

SHMLBA
    セグメントの境界アドレスの最小倍数。ページ境界に合ってなければならない。 現在の実装では SHMBLA の値は PAGE_SIZE である。

現在の実装では、プロセスごとの 共有メモリ・セグメントの最大数 (SHMSEG) に固有の制限は存在しない。

準拠
SVr4, SVID. SVr4 には他に EMFILE エラー状態についての記述がある。

関連項目
ipc(5), shmctl(2), shmget(2).