Linux之select

在使用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>