unix下通过(共享内存) 进行 (进程间通讯)???

两个进程间通过共享内存是怎么通讯的?能不能详细说说,并有没有什么相应书籍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 &brvbaruap-="" ¦="">size&gt;shminfo.shmmax){   
 2u.u_error = EINVAL;   
 3sp-&gt;shm_perm.mode = 0;   
 4return;   
 5}   
 6size = btoc(uap-&gt;size);   
 7if(shmtot+size &gt;shminfo.shmall){   
 8u.u_error = ENOMEM;   
 9sp-&gt;shm_perm.mode = 0;   
10return;   
11}   
12sp-&gt;shm_segsz =uap-&gt;size;   
13ptsize = btoc(sizeof(struct pt_entry)*size);   
14sp-&gt;shm_ptbl = (struct pt_entry *)sptalloc(ptsize,PG_V &amp;brvbarPG_KW,0);   
15if(sp-&gt;shm_ptbl == NULL ¦ ¦   
16memall(sp-&gt;shm_ptbl,size)==0)   
17u.u_error = ENOMEM;   
18sp-&gt;shm_perm.mode=0;   
19if(sp-&gt;shm_perm.mode = 0;   
20sptfree(sp-&gt;shm_ptbl,ptsize,1);   
21return;   
22}   
23  
24maxmem-=(ptsize+size);   
25shmtot+=size;   
26  
27sp-&gt;shm_perm.mode ¦=SHM_CLEAR;   
28sp-&gt;shm_nattch = sp-&gt;shm_cnattch = 0;   
29sp-&gt;shm_atime = sp-&gt;shm_dtime = 0;   
30sp-&gt;shm_ctime = time;   
31sp-&gt;shm_lpid =0;   
32sp-&gt;shm_cpid =u.u_procp-&gt;p_pid;   
33}else   
34if(uap-&gt;size&amp;&amp;uap-&gt;size<sp->shm_segsz){   
35u.u_error = EINVAL;   
36return;   
37}   
38u.u_ravl1 = sp-&gt;shm_perm.seq*shminfo.shmmni+(sp-shmem);   
39}</sp-></shminfo.shmmin>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus