在使用read,write函数在管道中处理数据时,会出现阻塞的现象。此时,可以使用fcntl设置read不阻塞。但是此时又有一个新的问题。如果在一个循环中,反复读取数据,则会频繁占用CPU,等同于for循环空转。所以,就需要select来解决问题了。使用select,可以设置管道端口的等待处理时间。比如说,在使用read时,提前设置好select,设置端口等待2s,当管道中没有数据时,read等待2s,仍然没有数据,则进行返回。
使用示例
说明直接看注释吧。
fd_set rd; //
struct timeval tv; // 保存延迟时间
int err;
FD_ZERO(&rd); // 初始化
FD_SET(in->pointer_to_main[0], &rd); // 绑定端口标识符
tv.tv_sec = in->config.block_wait_time / 1000000; // 设置阻塞等待时间,tv_sec 保存秒数,tv_usec 保存微秒数
tv.tv_usec = in->config.block_wait_time % 1000000;
while(1)
{
// 为端口设置延时,每次都需要设置一次。
err = select(in->pointer_to_main[0] + 1, &rd, NULL, NULL, &tv);
if (err == 0)
break;
else
{
tv.tv_sec = in->config.block_wait_time / 1000000; // 重新设置延时
tv.tv_usec = in->config.block_wait_time % 1000000;
}
// 等待超时,则退出
int size = read(in->pointer_to_main[0], mbf->buffer, in->config.buffer_size);
if (size == -1)
break;
}