当前位置: 技术问答>linux和unix
socket中的select模型问题
来源: 互联网 发布时间:2016-08-10
本文导语: 对select模型是有点理解,但我对select的异步机制还是不甚了解,在我看来既然是异步了那么就不需要开额外的线程,但从select的函数原型来看: int select( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct...
对select模型是有点理解,但我对select的异步机制还是不甚了解,在我看来既然是异步了那么就不需要开额外的线程,但从select的函数原型来看:
int select(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
如果说你设置了超时时间,并且网络数据并未返回,那么select函数就处于阻塞状态,既然是阻塞住了也意味着执行该函数的主线程被阻塞住了,为了避免这种情况就得额外开一个线程。可是既然承诺了异步那么就应该其内部帮我们做好这些工作,比方说叫我们注册一个回调函数之类,可是貌似没有这样的机制。
另外一个问题是:如果说我要主动关闭一个socket,我要如何和select函数进行配合以便能够优雅的关闭,而不是直接调用closesocket这样的函数进行粗暴干预。
另外初来咋到积分不是很多,请各位见谅!
int select(
int nfds,
fd_set* readfds,
fd_set* writefds,
fd_set* exceptfds,
const struct timeval* timeout
);
如果说你设置了超时时间,并且网络数据并未返回,那么select函数就处于阻塞状态,既然是阻塞住了也意味着执行该函数的主线程被阻塞住了,为了避免这种情况就得额外开一个线程。可是既然承诺了异步那么就应该其内部帮我们做好这些工作,比方说叫我们注册一个回调函数之类,可是貌似没有这样的机制。
另外一个问题是:如果说我要主动关闭一个socket,我要如何和select函数进行配合以便能够优雅的关闭,而不是直接调用closesocket这样的函数进行粗暴干预。
另外初来咋到积分不是很多,请各位见谅!
|
1.select函数本身是blocking的,用来支持I/O多路复用,参数传入的file descriptor需要是non-blocking。
异步(asynchronous)和non-blocking是由区别的,异步具有通知机制,而non-blocking需要不断的去check,直到读到数据或写完数据。
2.不知道第二个问题是不是想主动从select退出,然后主动关闭socket
通常的做法是在select的file descriptor多增加一个自己的socket,比如socket pair的读端。当需要主动从select返回时,就可以主动向socket pair的写端写入数据就好了。
异步(asynchronous)和non-blocking是由区别的,异步具有通知机制,而non-blocking需要不断的去check,直到读到数据或写完数据。
2.不知道第二个问题是不是想主动从select退出,然后主动关闭socket
通常的做法是在select的file descriptor多增加一个自己的socket,比如socket pair的读端。当需要主动从select返回时,就可以主动向socket pair的写端写入数据就好了。
|
第一个问题,有这样的机制,异步IO
第二个问题,你可以用kill()给这个线程发一个信号,那么select会返回,然后就可以进行close了.
第二个问题,你可以用kill()给这个线程发一个信号,那么select会返回,然后就可以进行close了.