VC天下 » Linux

I/O非阻塞方法

在接收数据时,默认的read/write函数、recv/send函数采用的是阻塞方式,即如果没有数据可操作,则函数调用将阻塞,导致对应进程暂停执行,有数据时才继续执行并返回。这显然耗时耗力。有时我们需要进程立即返回,这就需要设置为非阻塞方式了。
设置接收数据的非阻塞方式有多种方法,主要为:
1)、在recv接收数据时使用MSG_DONTWAIT标识,从而将某个单次接收操作设置为非阻塞方式。形如:
recv(sockfd, buf, BUFSIZE, MSG_DONTWAIT)。
2)、设置Socket文件描述符的属性为非阻塞,从而实现对该文件描述符的操作都为非阻塞方式,设置函数有setsockopt、fcntl、ioctl。形如:fcntl(sockfd, F_SETFL, O_NONBLOCK)。
一般在client端使用recv MSG_DONTWAIT,在server端使用fcntl O_NONBLOCK。
值得注意的是,上面两种方法只是解决了非阻塞接收消息,但没有解决终端的阻塞问题。所以,需要使用select提供轮询等待的方式从多个文件描述符中获取状态变化后的消息。此为I/O多路复用技术,可以为非堵塞I/O并行讨论的话题,此外,还有信号驱动I/O。

发表评论