当前位置: 技术问答>linux和unix
关于select函数中struct timeval问题
来源: 互联网 发布时间:2016-04-21
本文导语: 如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值么?就像对fd_set处理一样。 例如: fd_set readfd; struct timval tv; while(1) { FD_ZERO(&readfd); FD_SET(fd, &readfd); tv.tv_sec = 2; tv.tv_usec = ...
如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值么?就像对fd_set处理一样。
例如:
fd_set readfd;
struct timval tv;
while(1) {
FD_ZERO(&readfd);
FD_SET(fd, &readfd);
tv.tv_sec = 2;
tv.tv_usec = 0;
select(maxfd+1, &readfd, NULL, NULL, &tv);
......;
}
如上代码,对fd_set需要每次调用都要重新设置,那么对tv来说是否也是一样呢?能不能把对tv的赋值放在while外面?
例如:
fd_set readfd;
struct timval tv;
while(1) {
FD_ZERO(&readfd);
FD_SET(fd, &readfd);
tv.tv_sec = 2;
tv.tv_usec = 0;
select(maxfd+1, &readfd, NULL, NULL, &tv);
......;
}
如上代码,对fd_set需要每次调用都要重新设置,那么对tv来说是否也是一样呢?能不能把对tv的赋值放在while外面?
|
假如楼主将时间的初始化放在外边,时间初始化为2秒,假设在1秒后发上了事件,则select将会返回并将tv的时间变成上次阻塞的剩余时间,即1秒,然后再进行监视套接字。这是因为linux系统对select()的实现中会修改参数tv为剩余时间。所以在循环内部使用函数select的时候一定要在循环内部初始化时间参数。