进程间的另一种通信方式就是共享存储区。
一、为了达到共享存储区,有个相应的数据结构与之对应。通常是利用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环境高级编程》 第二版