共享内存
1. 允许两个不相关的进程访问同一个逻辑内存。
特点:共享内存是最快的一种IPC,在各个进程都有指针直接操作指向开辟的内存区域,访问时当作本进程中的一个内存控制直接操作
2.相关函数总结
(1)int shmget(key_t key,size_t size,int shmflg);//用来创建共享内存,成功返回共享内存标识符,失败返回-1
Key:键值对,有效的给共享内存段命名
Size:指定共享内存的容量,内核空间的大小
Shmflg:权限(0664),无共享内存段时需要按位或IPC_CREAT来创建,权限标志可以设置只有创建者拥有写的权限,其它用户只有读的权限
(2) Void * shmat(int shm_id,const *shm_addr,int shmflg);//允许其他进程对共享内存的访问(连接),将其连接到一个进程的地址空间中,成功返回指向共享内存第一个字节的指针,失败返回-1
Shm_id:shmget共享内存标识符
Shm_addr:连接到当前进程的地址位置,一般为NULL,让系统自动分配
Shmflg:SHM_RND:用来控制共享内存连接的地址,SHM_RDONLY:使得连接的内存为只读,一般给0可读可写。
(3)int shmdt(void *)//将共享内存从当前进程中分离(断开连接),成功返回0,失败返回-1,注意:只是分离并未删除,只是使共享内存对当前进程不再可用
Void *:是shmat返回的地址指针
(4) int shmctl(int shm_id,int command,struct shmid_ds *buf);//删除内核对象,成功返回0,失败返回-1
Shm_id:共享内存标识符
Command(采取的动作):IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值。,IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值。IPC_RMID:删除共享内存段。
buf指向Shmid_ds结构的指针:
Struct shmid_ds{
Uid_t shm_perm.uid;
Uid_t shm_perm.gid;
Mode_t shm_perm.mode;
}//指向包含共享内存模式和访问权限的结构。
注意:共享内存使两个以上的进程能够操作同一块物理空间上的区域,所以说共享区域成为临界区域。所以对于共享区域的访问,必须做同步控制(可用信号量)