Rõ ràng nếu bạn đang thăm dò dữ liệu đến, bạn nên tiêu thụ dữ liệu sẵn có (gọi là read()) hoặc vẫn sẽ ở đó và cuộc thăm dò sẽ quay trở lại ngay lập tức. Đối xứng không hoạt động thực sự cần thiết cho POLLOUT, nhưng bạn thường muốn gọi hàm viết tiếp theo() càng sớm càng tốt. Vì vậy, như một quy luật của POLLIN -> đọc, POLLOUT -> viết.
Bạn cũng nên đặt lại cấu trúc pollfd trước khi gọi lại cuộc thăm dò ý kiến.
fds[0].fd = sck;
fds[0].events = POLLIN;
fds[0].revents = 0;
ret = poll(fds, 1, 2000); //2 secs timeout
if(fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
Nếu bạn không đặt lại mỗi lần, rác từ cuộc gọi trước có thể thay đổi hành vi thăm dò ý kiến (tốt, không thực sự, đây chỉ là vấn đề về tính di động).
Trong mã sản xuất, bạn cũng phải kiểm tra giá trị trả về vì cuộc thăm dò ý kiến có thể bị gián đoạn vì một lý do khác so với sự kiện dự kiến (như tín hiệu). Sau đó, bạn thường muốn gọi nó một lần nữa thay vì đọc dữ liệu mà không có sẵn (như một lời nhắc nhở giá trị trả về thăm dò là số lượng các sự kiện, 0 thời gian chờ, -1 một số lỗi, có số trong errno).
Lỗi trên tệp mô tả được cung cấp để thăm dò ý kiến cũng có thể xảy ra. Họ sẽ không làm cho cuộc thăm dò trở lại một lỗi nhưng sẽ đặt POLLERR, POLLHUP hoặc POLLNVAL trong lĩnh vực revent của cấu trúc pollfd cho bộ mô tả tập tin đó. Nếu những sự kiện này được đặt, tính năng đọc cuộc gọi sẽ trả về một số mã lỗi mà bạn có thể kiểm tra.
Cảm ơn, nhưng tôi không cần phải đọc dữ liệu đó. Điều quan trọng với tôi là có một sự kiện. Bạn có nghĩ rằng tôi cần phải đọc điều đó. Có cách nào tôi có thể chỉ cần xóa bộ đệm? – domlao
Tôi nghĩ bạn phải đọc dữ liệu đó. –
Tôi thấy, cảm ơn, tôi nghĩ rằng cần phải làm điều đó. – domlao