集群系统MOSIX分析(4)
2008-12-01 11:02:39 来源:WEB开发网否则,调用comm_malloc分配内存,通过comm_dorecv试图将连接所有的数据(mlink->dlen)都接收放入到其中。data将指向分配的内存缓冲区。
comm_recvfrom():接收数据报
int comm_recvfrom(void *data, int len, mosix_link *mlink, mosix_addr *from, unsigned long timo)
读取长为len的数据放在data中,from返回接收数据报的源地址。timo指明超时值,单位为微秒。返回接收数据的长度( >0)或者错误。
调用套接字操作集上的recvmsg操作来接收数据,数据报的源地址返回在from中。如果接收到数据,则通过net_to_mos检查该源地址是否属于MOSIX节点。
如果不属于MOSIX节点,则comm_recvfrom()返回错误。
comm_free() :释放不再被使用的消息头或数据。
void comm_free(void *head)
如果当前进程的该连接是COMM_INFOLINK,则释放head,返回。
首先检查head是否超出连接消息头范围。如果head指向消息头的起始地址,则标记该消息头不再被使用(~COMM_HEADINUSE)。否则释放head所指的内存空间。
comm_mkhead() :准备指定大小的消息头空间
void *comm_mkhead(int hlen)
从内核中分配hlen大小的GFP_KERNEL内存空间,mlink->head指向分配的起始地址。
comm_flushdata():清空前一个消息剩余的数据
void comm_flushdata(int dlen)
如果当前连接是隐藏数据(mlink->flags & COMM_HIDEDATA),则从隐藏数据中flush长度为dlen的数据。否则,调用comm_dorecv从连接中读取长度为dlen的数据。
comm_peek():检查该连接是否有数据悬挂
int comm_peek(void)
调用套接字操作集上的poll函数来判断是否有数据悬挂。
comm_poll():等待直到有通讯事件、中断或MOSIX事件产生
int comm_poll(int mask, int interruptible, unsigned long timo)
interruptible指明是否可以被中断,timeo设置等待超时时间。
comm_wait() :等待消息到达或者MOSIX事件产生
int comm_wait(void)
返回1表示消息到达,返回0则表示先产生了一个事件。
comm_send_urgent():使用紧急数据(OOB)发送事件通知
int comm_send_urgent(void)
紧急事件通知只能由代理发送。MOSIX中将OOB数据定为0xdb。它只发送一个字节的有效数据(0xdb),通过将msghdr的msg_flags标志位设置MSG_OOB|MSG_NOSIGNAL来表示紧急情况。
comm_test_urgent():检查是否悬挂了紧急数据(OOB)
int comm_test_urgent(void)
通过设置MSG_OOB|MSG_PEEK|MSG_DONTWAIT|MSG_NOSIGNAL属性来调用套接字操作集上的recvmsg操作来接收数据。如果接收到的长度为1且等于0xdb,则表明悬挂了紧急数据。
comm_take_urgent():从流中取出悬挂的OOB数据,以免被转化为普通数据处理
void comm_take_urgent(void)
调用者必须确保流中没有其它的数据。
首先以MSG_OOB|MSG_DONTWAIT|MSG_NOSIGNAL属性读取一字节,判断是否有OOB数据,然后设置套接字SO_OOBINLINE选项为on,让带外数据保留在正常的输入队列中。然后调用套接字操作集上的recvmsg操作来读取这一个字节的带外数据。最后关闭套接字的SO_OOBINLINE选项。
更多精彩
赞助商链接