UNIX情形高级编程:System V 共享内存区
2.shmat函数(共享内存映射) 由shmget创建或打开一个共享内存区后,通过调用shmat把它附接到调用进程的地址空间。 #include <sys/shm.h> void* shmat(int shmid,const void *shmaddr,int flag); 其中shmid是由shmget返回的标识符。shmat的返回值是所指定的共享内存区在调用进程内的起始地址。确定这个地址的规则如下: (1)如果shmaddr是一个空指针,那么系统替调用者选择地址。这是推荐的方法。 (2)如果shmaddr是一个非空指针,那么返回地址取决于调用者是否给flag参数指定了SHM_RND值: a.如果没有指定SHM_RND,那么相应的共享内存区附接到由shmaddr参数指定的地址; b.如果指定了SHM_RND,那么相应的共享内存附接到由shmaddr参数指定的地址向下舍入一个SHMLBA常值。LBA代表“低端边界地址”。 默认情况下,,只要调用进程具有某个共享内存区得读写权限,它附接该内存区后就能够同时读写该内存区。flag参数中也可以指定SHM_RDONLY值,它限定只读访问。flag参数默认是0,表示共享内存可读写。 3.shmdt函数(共享内存解除映射) 当一个进程完成某个共享内存区的使用时,它可以调用shmdt断接这个内存区。 #include <sys/shm.h> int shmdt(const void *shmaddr); 当一个进程终止时,它当前附接着的所有共享内存区都自动断接掉。 注意本函数调用并不删除所指定的共享内存区。这个删除工作通过以IPC_RMID命令调用shmctl完成。 4.shmctl函数 shmctl提供了对一个共享内存区的多种操作。 #include <sys/shm.h> int shmctl(int shmid,int cmd,struct shmid_ds *buff); 该函数提供了三个命令: IPC_RMID 从系统中删除由shmid标识的共享内存区并拆除它。 IPC_SET 给所指定的共享内存区设置其shmid_ds结构的以下三个成员:shm_perm.uid,shm_perm.gid和shm_perm.mode,他们的值来自buff参数指向的结构中的相应成员。shm_ctime的值也用当前时间替换。 IPC_STAT (通过buff参数)向调用者返回所指定共享内存区当前的shmid_ds结构。 5.shmget程序(shmget.c) 下面是给出的shmget程序使用指定的路径名和长度创建一个共享内存区。 #include "unpipc.h" int main(int argc,char ** argv) { int c,id,oflag; char *ptr; size_t length; oflag = SVSHM_MODE | IPC_CREAT; while( ( c= getopt(argc,argv,"e") ) != -1 ) { switch(c){ case 'e': oflag |= IPC_EXCL; break; } } if(optind != argc -2) err_quit("usage: shmget [-e] <pathname> <length>"); length = atoi(argv[optind + 1]); id = shmget(ftok(argv[optind],0),length,oflag); ptr = shmat(id,NULL,0); exit(0); } (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |