两个进程间通过共享内存是怎么通讯的?能不能详细说说,并有没有什么相应书籍or资料or例程看看。
小弟新人,先谢谢了!
---------------------------------------------------------------
以前接触过,不熟,知道大概:
共享内存是System V的进程通讯方式之一,大概的过程是
先从内存中开辟出一块,并赋予一个标示符,然后,多个程序之间就可以通过
他进行通讯,需要注意的是,使用这种方式一般需要结合"信号量"来进行管理,防止出现同时写以及死锁(就是典型的供应者/消费者问题)。
---------------------------------------------------------------
这是system V的IPC三大法宝之一:
共享虚空间的若干部分,然好通过直接读写来通信。
shmget 建立新的共享存储区
shmdt shmat 分别将之和一个进程空间附加和断开
shmctl 对参数进行控制
以下是unix的shmget实现的源代码*************************
shmget()
{
register struct a {
key_t key;
int size,
shmflg;
}uap = (struct a)u.u_ap;
register struct shmid_ds *sp;
int s;
int size,ptsize;
if((sp = ipcget(uap->key,uap->shmflg,shmem,shminfo.shmmni,sizeof(*sp),&s))==NULL)
return;
if(s){
if(uap->size
1<shminfo.shmmin ¦uap-="" ¦="">size>shminfo.shmmax){
2u.u_error = EINVAL;
3sp->shm_perm.mode = 0;
4return;
5}
6size = btoc(uap->size);
7if(shmtot+size >shminfo.shmall){
8u.u_error = ENOMEM;
9sp->shm_perm.mode = 0;
10return;
11}
12sp->shm_segsz =uap->size;
13ptsize = btoc(sizeof(struct pt_entry)*size);
14sp->shm_ptbl = (struct pt_entry *)sptalloc(ptsize,PG_V &brvbarPG_KW,0);
15if(sp->shm_ptbl == NULL ¦ ¦
16memall(sp->shm_ptbl,size)==0)
17u.u_error = ENOMEM;
18sp->shm_perm.mode=0;
19if(sp->shm_perm.mode = 0;
20sptfree(sp->shm_ptbl,ptsize,1);
21return;
22}
23
24maxmem-=(ptsize+size);
25shmtot+=size;
26
27sp->shm_perm.mode ¦=SHM_CLEAR;
28sp->shm_nattch = sp->shm_cnattch = 0;
29sp->shm_atime = sp->shm_dtime = 0;
30sp->shm_ctime = time;
31sp->shm_lpid =0;
32sp->shm_cpid =u.u_procp->p_pid;
33}else
34if(uap->size&&uap->size<sp->shm_segsz){
35u.u_error = EINVAL;
36return;
37}
38u.u_ravl1 = sp->shm_perm.seq*shminfo.shmmni+(sp-shmem);
39}</sp-></shminfo.shmmin>