进程间通信(四)共享内存

                                                                                           共享内存

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;

}//指向包含共享内存模式和访问权限的结构。

注意:共享内存使两个以上的进程能够操作同一块物理空间上的区域,所以说共享区域成为临界区域。所以对于共享区域的访问,必须做同步控制(可用信号量)



猜你喜欢

转载自blog.csdn.net/shinedays/article/details/78502562