当前位置: 技术问答>linux和unix
使用非阻塞式IO接收客户数据?
来源: 互联网 发布时间:2015-03-26
本文导语: 我在进行网络编程的时候,遇到一个困惑的问题。 我在一个主循环里面使用非阻塞IO,等待客户连接。accept返回后,创建一个新的进程用来处理这个客户的请求。代码如下(删了很多): .... while(1) { select(....); recv(.....
我在进行网络编程的时候,遇到一个困惑的问题。
我在一个主循环里面使用非阻塞IO,等待客户连接。accept返回后,创建一个新的进程用来处理这个客户的请求。代码如下(删了很多):
....
while(1)
{
select(....);
recv(....)
}
....
我的问题是在非阻塞IO的情况下,我的新进程的循环在运行到select函数时,是否会在没有数据来的时候阻塞呢?如果不会,那么循环就会不断的运行,这样会很耗CPU,这个时候大家是如何解决的呢?
我在一个主循环里面使用非阻塞IO,等待客户连接。accept返回后,创建一个新的进程用来处理这个客户的请求。代码如下(删了很多):
....
while(1)
{
select(....);
recv(....)
}
....
我的问题是在非阻塞IO的情况下,我的新进程的循环在运行到select函数时,是否会在没有数据来的时候阻塞呢?如果不会,那么循环就会不断的运行,这样会很耗CPU,这个时候大家是如何解决的呢?
|
在select中设置读写文件描述符(socket)或设置超时。
|
我也是刚学Linux,不过在看过北邮出版社的那本《linux网络编程》后对此有点了解。我觉得select的特殊意义就在于它是类似于中断的方法,自己挂起(直到超时),如果在期间数据来到并符合自己摄制的条件,Linux内核会将你的这个进程唤醒,这样你的进程不会不断运行,(除非来了很多数据)用select函数的意义就在于此,建议你去看看那本书的这部分,作者对socket编程进行了编类,并对每一种类进行了使用级别的原理介绍。
Good Luck!
Good Luck!
|
我的问题是在非阻塞IO的情况下,我的新进程的循环在运行到select函数时,是否会在没有数据来的时候阻塞呢?如果不会,那么循环就会不断的运行,这样会很耗CPU,这个时候大家是如何解决的呢?
man select
在select的读写描述字集中添加描述字,如果没有可读、写的描述字,会阻塞的。
man select
在select的读写描述字集中添加描述字,如果没有可读、写的描述字,会阻塞的。
|
会不会阻塞要看你SELECT的参数,如果你设置了超时参数,就会在有事件的时候返回,否则要等到超时。另外,你用专门的进程处理一个连接,为什么怕阻塞呢?