同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。所以必须要某种同步机制来保证该共享内存中资源的准确性。
共享内存相关函数
shmget()创建共享内存并返回标识符
头文件 #include<sys/shm.h>
int shmget(key_t key, size_t size, int shmflag);
第一个参数key,与信号量一样,程序需要提供一个参数key,有效地为共享内存段命名。有一个特殊的键值:IPC_PRIVATE,它用于创建一个只属于创建进程的共享内存,通常你不会用到这个值。
第二个参数size,以字节为单位指定需要共享的内存容量。
第三个参数shmflag,与创建文件时使用的mode、标志一样,由IPC_CREAT定义的一个特殊比特必须和权限标志按位或才能创建一个新的共享内存段。如果无需用到IPC_CREAT标志,该标志就会被悄悄忽略。
如果共享内存创建成功,shmget返回一个共享内存标识符(非负整数),该标识符将用于后续的共享内存函数。如果失败了就返回-1.
shmat()函数将共享内存链接到当前进程
void* shmat(int shm_id, const void* shm_addr, int shmflg);
第一个参数shm_id是由shmget函数返回的共享内存标识符
第二个参数shm_addr指定的是共享内存链接到当前进程中的地址位置。它通常是一个空指针,表示让系统来选择共享内存出现的地址
第三个参数shmflg十一组位标志。它的两个可能取值是SHM_RND和SHM_RDONLY。其中SHM_RND与shm_addr联合使用,用来控制共享内存的链接地址。SHM_RDONLY使得链接的内存只读。
我们很少需要控制共享内存链接的地址,通常都是让系统来选择一