集群系统MOSIX分析(4)
2008-12-01 11:02:39 来源:WEB开发网根据msg,通过调用套接字操作集上的recvmsg操作从网络连接上读取数据。它读的是字节流,并没有格式的。
comm_recv() :接收消息头
int comm_recv(void **headp, int *hlen)
如果当前进程的连接处于等待接受连接请求状态(COMM_WAITACCEPT),则等待直到接受请求。然后通过comm_dorecv()接收消息头长度(COMM_HLEN)的数据,得到消息头的实际长度(hlen+olen),然后准备空间存放消息头数据(comm_mkhead),再通过comm_dorecv()接收实际的消息头数据,并根据其中的信息,调用不同的解压处理程序。因为为了减少传输的数据量,消息数据发送前都经过了压缩。
如果有数据COMM_MFDATA,则将数据长度保存在连接的数据长度中(mlink->dlen = header.dlen),这样,随后调用comm_copydata和comm_recvdata时,我们将知道应该能够从网络中读取多少数据。
comm_copydata():从消息中拷贝数据
int comm_copydata(void *data, int len, int uspace) 返回0表示成功。
从消息中拷贝长度为len的数据。读入的数据保存在data指向的buffer中。Uspace表明data是指向用户空间还是内核空间。成功时返回0。
如果要data指向用户空间(uspace),且会导致远程page-fault(!dirty_all_remote_pages),则返回内存不足错误。
如果连接中不存在数据,但是隐藏数据缓冲区不为空,则从隐藏数据缓冲区拷贝len长数据到data中。否则则通过comm_dorecv函数从网络中读取数据。
comm_recvdata():从连接中将所有数据读取到已分配缓冲区中/*
int comm_recvdata(void **data) 返回0表示成功。
如果连接中存在隐藏数据(COMM_HIDEDATA),则data指向隐藏数据缓冲区,然后置连接的隐藏数据缓冲区为NULL。
更多精彩
赞助商链接