我对共享存储区的理解

进程间的另一种通信方式就是共享存储区。

一、为了达到共享存储区,有个相应的数据结构与之对应。通常是利用shmget建立这个结构,即建立共享存储区,然后可以用shmctl对这个结构进行相关的操作设置等。

最重要的是进程调用shmat函数将该共享存储区与之相对应,如果多个进程对该共享存储区进行对应的话,就可达到进程间的通信。需要注意的是,不可同时对该共享存储区进行多个进程的同时访问,即如果一个进程利用shmat对某一个共享存储区进行了对应,并且对该存储区进行了访问操作,而且正在进行中,那么此时其他进程再次利用shmat对该共享存储区进行访问的话则需挂起,直到正在访问的进程离开该共享存储区。为了标志有多少个进程shmat了该共享存储区,共享存储区相应的数据结构中有个变量进行了标示即用shm_nattach这个变量进行标示,每shmat一次shm_nattach就减1,而每当进程离开时则用shmdt进行这个变量的加法。

二、关于共享存储区要记住:一个结构shmid_ds,四个函数shmget,shmctl,shmat,shmdt

2.1一个结构  stuct shmid_ds {

struct ipc_perm shm_perm;

size_t shm_segsz;

pid_t shm_lpid;

pid_t shm_cpid;

shmatt_t shm_nattch;

time_t shm_atime;

time_t shm_dtime;

time_t shm_ctime;

...

}

可以从下面几个角度对该结构进行记忆:1.结构权限 2.相关的进程 3.相关的时间 4.attach标记

2.2四个函数:

int  shmget(key_t key,size_t size,int flags) 

建立一个共享存储区

int shmctl(int shmid,int cmd,struct shmid *buf)

对该结构进行相关操作

void  *shmat(int shmid,void *addr,size_t len,int flag)

将共享存储段与进程链接

int shmdt(void *addr)

用于在进程对共享段访问结束时调用 ,以用来对shm_nattch进行减一操作。

对四个函数的记忆角度:建立共享存储——>对共享存储的结构进行一些操作——>进程使用共享存储——>进程离开共享存储。


参考文献:《unix环境高级编程》 第二版


你可能感兴趣的:(数据结构,编程,unix,struct,cmd,存储)