NetBSD 进程间通讯系统分析
2006-08-09 22:57:11 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閹冣挃闁硅櫕鎹囬垾鏃堝礃椤忎礁浜鹃柨婵嗙凹缁ㄧ粯銇勯幒瀣仾闁靛洤瀚伴獮鍥敍濮f寧鎹囬弻鐔哥瑹閸喖顬堝銈庡亝缁挸鐣烽崡鐐嶆棃鍩€椤掑嫮宓佸┑鐘插绾句粙鏌涚仦鎹愬闁逞屽墰閹虫捇锝炲┑瀣╅柍杞拌兌閻ゅ懐绱撴担鍓插剱妞ゆ垶鐟╁畷銉р偓锝庡枟閻撴洘銇勯幇闈涗簼缂佽埖姘ㄧ槐鎾诲礃閳哄倻顦板┑顔硷工椤嘲鐣烽幒鎴旀瀻闁规惌鍘借ⅵ濠电姷鏁告慨顓㈠磻閹剧粯鈷戞い鎺嗗亾缂佸鏁婚獮鍡涙倷閸濆嫮顔愬┑鐑囩秵閸撴瑦淇婇懖鈺冪<闁归偊鍙庡▓婊堟煛鐏炵硶鍋撻幇浣告倯闁硅偐琛ラ埀顒冨皺閺佹牕鈹戦悙鏉戠仸闁圭ǹ鎽滅划鏃堟偨缁嬭锕傛煕閺囥劌鐏犻柛鎰ㄥ亾婵$偑鍊栭崝锕€顭块埀顒佺箾瀹€濠侀偗婵﹨娅g槐鎺懳熺拠鑼舵暱闂備胶枪濞寸兘寮拠宸殨濠电姵纰嶉弲鎻掝熆鐠虹尨宸ョ€规挸妫濆铏圭磼濡搫顫嶇紓浣风劍閹稿啿鐣烽幋锕€绠婚悹鍥у级瀹撳秴顪冮妶鍡樺鞍缂佸鍨剁粋宥夋倷椤掍礁寮垮┑鈽嗗灣閸樠勭妤e啯鍊垫慨妯煎亾鐎氾拷

每个 IPC 结构都有一个权限表项, 其权限设置与文件的权限设置相似, 通过它我们可以限定某些进程相互通信的权限.
以上标识方法的描述在 struct ipc_perm, 每个 IPC 对象结构都带有一个 ipc_perm.
消息队列 (message queue)
消息的对象结构描述在 struct msqid_ds, 全局的控制结构在 struct msginfo.
msgget(2)
分配一个 msg 结构的过程是简单的. 若创建参数不是 IPC_PRIVATE (私有 msg, 任何时候都新建一个 msg 结构) 我们用线性查找寻得对应的 msg, 返回之. 若为 IPC_PRIVATE 或找不到相应结构而我们设置了可以创建新的, 我们就创建一个新的 msg 结构. ps. 对处理这种相对复杂的设置参数, 这段代码写得很优美.
msgsnd(2)
我们再来看消息的发送. 我们获得通信实例并验证, 计算需要多少个通信块, 接着我们等待所有资源 (包括权限, 内存块) 到位. 接下来我们要申请一个 msghdr, 对应 struct __msg, 这是 message queue 里面的 msg 实体,, 然后在用链表接起来的 msgmaps 中申请消息内存, 并用链表 (从 msghdr->msg_spt 起 ) 将申请到的内存块相连. 接下来的工作是显而易见的, 我们只需把用户提供的消息放进消息体, 再将消息体连入 message queue 中即可.
NOTE. 对某个大小计算需要多少个数据块放入是很常见的计算. 这里的代码写得
简洁优美: segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz;
msgrcv(2)
msgrcv(2) 是一个与 msgsnd(2) 想对应的过程. 注意我们并不一定要获取消息队列头部的数据, 我们可以通过设置 msgtyp 获取消息队列中其他位置的数据, 我们的 "while (msghdr == NULL)" 完成了查找对应 msg 的过程, 我们在这里可能会因为没有相应消息而 sleep. 接下来我们只需把消息体返回给用户就可以了.
更多精彩
赞助商链接