|
发表于 2020-5-14 17:45:01
|
显示全部楼层
flag可以设置共享存储段的访问权限,也可以设置
两个标志:IPC_CREAT和IPC_EXCL。
shmget调用成功返回一个非负整数,即与key相连
的共享存储段id。如果是一个新的共享存储段,shmget
将初始共享存储段中所有单元为0,同时创建与参数key
相连的数据结构shmid_ds。
shmget调用失败将返回-1并置errno指明错误原因。
shmctl函数对共享存储段执行多种操作,其函数原型如
下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct
shmid_ds *buf) ;
说明:
cmd参数指定下列5种命令中一种,使其在shmid指
定的段上执行:
IPC_STAT 对此段取shmid_ds结构,并存放在由buf指向的结构中。
IPC_SET 按buf指向的结构中的值设置与此段相关结构中的下列三个字段:shm_perm.uid、shm_perm.gid以及shm_perm.mode。
IPC_RMID 从系统中删除该共享存储段。因为每个共享存储段有一个连接计数(shm_nattch在shmid_ds结构中) ,所以除非使用该段的最后一个进程终止或与该段脱接,否则不会实际上删除该存储段。不管此段是否仍在使用,该段标识符立即被删除,所以不能再用shmat与该段连接。
SHM_LOCK 锁住共享存储段。此命令只能由超级用户执行。
SHM_UNLOCK 解锁共享存储段。此命令只能由超级用户执行。
一旦创建了一个共享存储段,进程就可调用shmat将其
连接到它的地址空间中,其函数原型如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
void *shmat(int shmid, void *addr, int flag);
说明:
共享存储段连接到调用进程的哪个地址上与addr
参数以及在flag中是否指定SHM_RND位有关。
(1) 如果addr为0,则此段连接到由内核选择的第一个可用地址上。
(2) 如果addr非0,并且没有指定SHM_RND,则此段连接到addr所指定的地址上。
(3) 如果addr非0,并且指定了SHM_RND,则此段连接到( addr-(addr mod SHMLBA))所表示的地址上。
如果在flag中指定了SHM_RDONLY位,则以只读方
式连接此段。否则以读写方式连接此段。shmat的返回值
是该段所连接的实际地址,如果出错则返回-1。
当进程不再需要一个共享存储段时,可以调用shmdt函数
将它从进程的地址空间分离。其函数原型如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmdt(void *addr) ;
说明:
addr参数是以前调用shmat时的返回值。注意,这
个函数仅是是一个共享存储段不再与调用进程的地址空
间相连,它并不实际删除共享存储段本身,删除共享存
储段是shmctl函数IPC_RMID命令的功能。
|
|