相关系统调用
1.创建/打开已存在共享内存区——shmget()
shmget(key, size, flag);
返回内存区标识号。
2.映射共享内存区和进程虚拟地址空间——shmat()
shmat(id, addr, flag);
返回映射地址。
id:由shmget()返回,用来标识某共享内存区。
addr:用户希望映射到哪块虚拟地址,通常设为NULL。
flag:规定对此区是否是只读等性质。
3.断开映射——shmdt()
shmdt(addr);
addr:shmat()所返回的虚拟地址。
4.控制对共享内存区的各种操作——shmctl()
shmctl(id, cmd, shmstatbuf);
id:shmget()返回的标识号。
cmd:要进行的操作类型,如IPC_RMID删除共享内存区。
shmstatbuf:一个结构体,用来修改或获取内存区当前状态,当cmd为IPC_RMID时,设置为NULL。
代码实现
写者程序
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #define SHMKEY 741 int shmid; int main(){ int i; unsigned int *addr1; int *p; ///creat a shared memory section shmid = shmget(SHMKEY, 4*1024, 0777|IPC_CREAT); ///link addr1 = shmat(shmid, NULL, 0); printf("addr1 = 0x%x\n", addr1); p = addr1; for(i = 255; i < 899; i++){ *p++ = i; } }
读者程序
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #define SHMKEY 741 int shmid; int main(){ int i; unsigned int *addr2; int *p; ///creat a shared memory section shmid = shmget(SHMKEY, 4*1024, 0777|IPC_CREAT); ///link addr2 = shmat(shmid, NULL, 0); printf("addr2 = 0x%x\n", addr1); p = addr2; for(i = 255; i < 899; i++){ printf("%d\t", *p++); } ///delete shared memory section shmctl(shmid, IPC_RMID, NULL); return 0; }