WEB开发网
开发学院软件开发VC NetBSD 进程间通讯系统分析 阅读

NetBSD 进程间通讯系统分析

 2006-08-09 22:57:11 来源:WEB开发网   
核心提示: 每个 IPC 结构都有一个权限表项, 其权限设置与文件的权限设置相似, 通过它我们可以限定某些进程相互通信的权限. 以上标识方法的描述在 struct ipc_perm, 每个 IPC 对象结构都带有一个 ipc_perm. 消息队列 (message queue)消息的对象结构描述在 s

每个 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. 接下来我们只需把消息体返回给用户就可以了.

上一页  1 2 3 4  下一页

Tags:NetBSD 进程 通讯系统

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接