SYSTEM CALL: shmctl(); PROTOTYPE: int shmctl ( int shmqid, int cmd, struct shmid_ds *buf ); RETURNS: 0 on success -1 on error: errno = EACCES (No read permission and cmd is IPC_STAT) EFAULT (Address pointed to by buf is invalid with IPC_SET and IPC_STAT commands) EIDRM (Segment was removed during retrieval) EINVAL (shmqid invalid) EPERM (IPC_SET or IPC_RMID command was issued, but calling process does not have write (alter) access to the segment) NOTES:
检索段的 shmid_ds 结构,并将其存储在 buf 参数的地址中
设置段的 shmid_ds 结构的 ipc_perm 成员的值。 从 buf 参数获取这些值。
标记一个段以便删除。
IPC_RMID 命令实际上并没有从内核中删除一个段。 而是,它标记该段以便删除。 实际删除发生在最后一个当前连接到该段的进程正确地分离它时。 当然,如果没有进程当前连接到该段,则删除似乎是立即的。
要正确地分离共享内存段,进程调用 shmdt 系统调用。