Tôi đang sử dụng select()
trên nền tảng Linux/ARM để xem liệu ổ cắm udp đã nhận được gói hay chưa. Tôi muốn biết bao nhiêu thời gian còn lại trong cuộc gọi chọn nếu nó trả về trước khi thời gian chờ (đã phát hiện một gói).Thời gian còn lại trên một select() gọi
cái gì đó dọc theo dòng:
int wait_fd(int fd, int msec)
{
struct timeval tv;
fd_set rws;
tv.tv_sec = msec/1000ul;
tv.tv_usec = (msec % 1000ul) * 1000ul;
FD_ZERO(& rws);
FD_SET(fd, & rws);
(void)select(fd + 1, & rws, NULL, NULL, & tv);
if (FD_ISSET(fd, &rws)) { /* There is data */
msec = (tv.tv_sec * 1000) + (tv.tv_usec/1000);
return(msec?msec:1);
} else { /* There is no data */
return(0);
}
}
Tôi không chắc câu hỏi của bạn là gì. Mã của bạn giải quyết được vấn đề; Thời gian còn lại được ghi vào tham số timeout. Quoth select (2): "Trên Linux, select() sửa đổi thời gian chờ để phản ánh lượng thời gian không ngủ, hầu hết các cài đặt khác không làm điều này. (POSIX.1-2001 cho phép một trong hai hành vi.)" – phihag
@phihag: "giấy phép hoặc là hành vi "... xem chính xác giá trị thời gian chờ sau khi một cuộc gọi chọn là không di động –