SHMCTL(2) | Linux Programmer's Manual | SHMCTL(2) |
shmctl - System V 共有メモリー (shared memory) を制御する
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmctl() は、識別子が shmid の System V 共有メモリーセグメントに対して cmd で指示した制御命令を実行する。
buf 引数は、 shmid_ds 構造体へのポインターである。 この構造体は <sys/shm.h> で以下のように定義されている
struct shmid_ds { struct ipc_perm shm_perm; /* 所有権と許可 */ size_t shm_segsz; /* セグメントのサイズ (バイト) */ time_t shm_atime; /* 最後の付加 (attach) の時刻 */ time_t shm_dtime; /* 最後の分離 (detach) の時刻 */ time_t shm_ctime; /* 作成時刻 / shmctl() による 最後の変更時刻 */ pid_t shm_cpid; /* 作成者 (creator) の PID */ pid_t shm_lpid; /* 最後の shmat(2)/shmdt(2) の PID */ shmatt_t shm_nattch; /* 現在付加されている数 */ ... };
shmid_ds 構造体のフィールドは以下の通りである。
ipc_perm 構造体は以下のように定義されている (強調されたフィールドは IPC_SET を使って設定可能である):
struct ipc_perm { key_t __key; /* shmget(2) に与えられるキー */ uid_t uid; /* 所有者の実効 UID */ gid_t gid; /* 所有者の実効 GID */ uid_t cuid; /* 作成者の実効 UID */ gid_t cgid; /* 作成者の実効 GID */ unsigned short mode; /* 許可 + SHM_DEST と SHM_LOCKED フラグ */ unsigned short __seq; /* シーケンス番号 */ };
The least significant 9 bits of the mode field of the ipc_perm structure define the access permissions for the shared memory segment. The permission bits are as follows:
0400 | Read by user |
0200 | Write by user |
0040 | Read by group |
0020 | Write by group |
0004 | Read by others |
0002 | Write by others |
Bits 0100, 0010, and 0001 (the execute bits) are unused by the system. (It is not necessary to have execute permission on a segment in order to perform a shmat(2) call with the SHM_EXEC flag.)
cmd として有効な値は以下の通り:
struct shminfo { unsigned long shmmax; /* 最大セグメントサイズ */ unsigned long shmmin; /* 最小セグメントサイズ。 常に 1 */ unsigned long shmmni; /* 最大セグメント数 */ unsigned long shmseg; /* プロセスが付加できる セグメントの最大数。 カーネル内では未使用 */ unsigned long shmall; /* 共有メモリーの最大ページ数。 システム全体での値 */ };
struct shm_info { int used_ids; /* 現在存在するセグメント数 */ unsigned long shm_tot; /* 共有メモリーのページ総数 */ unsigned long shm_rss; /* メモリー上にある (スワップされて いない) 共有メモリーページ数 */ unsigned long shm_swp; /* スワップされている共有メモリー ページ数 */ unsigned long swap_attempts; /* Linux 2.4 以降では未使用 */ unsigned long swap_successes; /* Linux 2.4 以降では未使用 */ };
呼び出し元は、cmd に以下の値を指定することで、共有メモリーセグメントが スワップされることを防止したり、許可したりできる:
2.6.10 より前のカーネルでは、特権プロセスだけが SHM_LOCK と SHM_UNLOCK を利用することができた。 2.6.10 以降のカーネルでは、非特権プロセスであっても次の条件を満たせば これらの操作を利用することができる。その条件とは、プロセスの実効 UID がそのセグメントの所有者もしくは作成者の UID と一致し、 (SHM_LOCK の場合には) ロックするメモリーの合計が RLIMIT_MEMLOCK リソース上限 (setrlimit(2) 参照) の範囲内に入っていることである。
IPC_INFO と SHM_INFO 操作は、成功すると、全ての共有メモリーセグメントに関する情報を 管理しているカーネルの内部配列の使用中エントリーのインデックスの うち最大値を返す (この情報は、システムの全ての共有メモリーセグメントに関する情報を 取得するために、操作 SHM_STAT か SHM_STAT_ANY を繰り返し実行する際に使用できる)。 SHM_STAT 操作は、成功すると、 shmid で指定されたインデックスを持つ共有メモリーセグメントの識別子を返す。 他の操作は、成功の場合 0 を返す。
エラーの場合は -1 を返し、 errno を適切に設定する。
POSIX.1-2001, POSIX.1-2008, SVr4.
Linux や POSIX の全てのバージョンでは、 <sys/types.h> と <sys/ipc.h> のインクルードは必要ない。しかしながら、いくつかの古い実装ではこれらのヘッダーファイルのインクルードが必要であり、 SVID でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。
IPC_INFO, SHM_STAT, SHM_INFO 操作は、 ipcs(1) プログラムで割り当て済の資源に関する情報を提供するために 使用されている。将来、これらの操作は変更されたり、 /proc ファイルシステムのインターフェースに移動されるかもしれない。
Linux では、 shmctl(IPC_RMID) を使ってすでに削除マークがつけられている共有メモリーセグメントを あるプロセスが付加 (attach) (shmat(2)) することを許可している。 この機能は他の UNIX の実装では利用できない。 移植性を考慮したアプリケーションではこれに依存しないようにすべきである。
構造体 shmid_ds 内の多くのフィールドは、 Linux 2.2 では short 型だったが、Linux 2.4 では long 型になった。 この利点を生かすには、glibc-2.1.91 以降の環境下で 再コンパイルすれば十分である。 カーネルは新しい形式の呼び出しと古い形式の呼び出しを cmd 内の IPC_64 フラグで区別する。
mlock(2), setrlimit(2), shmget(2), shmop(2), capabilities(7), sysvipc(7)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-12-21 | Linux |