一.system V 共享内存方式:
1.
int shmget(key_t key,
size_t size, int shmflg);
1> key 为共享内存标识,为一个数字,表示要打开的共享内存块。
2> size指定共享内存大小,
3> shmflg标识内存的所有情况,IPC_CREAT 表示如果共享内存不存在,就创建,否则打
开对应共享内存,IPC_EXCL 表示如果共享内存不存在,则打开,否则产生错误,
4> 调用成功则返回共享内存的ID,失败则返回一个负数。
例:
- #define IPC_NAME 1630
- int shm_id;
- size_t size=4096
- shm_id=shmget(IPC_NAME,size,IPC_CREAT | IPC_EXCL |0666);
2.void* shmat( int shm_id,void *shmaddr , int shmflag )
1> shm_id 为共享内存块的ID,
2> shmaddr 指定要获取的共享内存偏移量。
例:
- p_map=(people*)shmat(shm_id,NULL,0);
- if((int64_t)p_map == -1) return 0;
3.int shmctl(
int shmid ,
int cmd ,
struct shmid_ds *buf );
1> int shmid:是共享内存的ID.
2> int cmd: 是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态,
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
3> struct shmid_ds *buf 是一个结构体指针。
IPC_STAT的时候,取得的状态放在这个结构体中。
如果要改变共享内存的状态,用这个结构体指定。
4> 返回值: 成功:0失败:-1
5> 使用例子:
shmctl(shmid,IPC_RMID,NULL);
4.
int shmdt(
char *shmaddr );
1> char *shmaddr 表示本进程使用的共享内存块的相对地址。
将由 shmat
函数返回的地址传递给这个函数,然后函数将该地址与共享内存块脱离关系。
对 exit
或任何exec族函数的调用都会自动使进程脱离共享内存块。
例:
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <errno.h>
- typedef struct
- {
- char name;
- int age;
- }people;
- #define IPC_NAME 1630
- int main(int argc,char **argv)
- {
- int shm_id,i;
- key_t key;
- char temp_char;
- people *p_map;
- shm_id=shmget(IPC_NAME,4096,IPC_CREAT | IPC_EXCL |0666);
- if(shm_id<0)
- {
- printf("shmget error\n");
- if(errno != EEXIST) return 1;
- shm_id = shmget(IPC_NAME,4096,0666);
- if(shm_id < 0)
- {
- return 0;
- }
- printf("shmget open %d succedd\n",IPC_NAME);
- }
- p_map=(people*)shmat(shm_id,NULL,0);
- if((int64_t)p_map == -1) return 0;
- printf("%x\n",p_map);
- for(int i=0; i<12; i)
- {
- printf("name=%c,age=%d\n",p_map->name,p_map->age);
- p_map;
- }
- temp_char='a';
- p_map = p_map - 12;
- for(i=0;i<10;i )
- {
- (*(p_map i)).name=temp_char;
- (*(p_map i)).age=20 i;
- temp_char =1;
- }
- printf("Write end\n");
- if(shmdt(p_map)<0)
- printf("detach error");
- int ret = shmctl(shm_id,IPC_RMID,NULL);
- if(ret < 0)
- {
- printf("Deltet shm memery failed\n");
- }
- else{
- printf("Delete shm memory Succedd\n");
- }
- return 0;
- }
阅读(2126) | 评论(0) | 转发(0) |