Mô hình I/O multiplexing được tóm tắt như sau:
Các hàm quan trọng:
1
2
3
4
5
6
7
8
9
10
| int select( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct *timeout); void FD_CLR( int fd, fd_set *fdset); //xóa bit tương ứng trong fdset //sử dụng hàm này sau select để kiểm tra bit tương ứng trong fdset là được set hoặc không int FD_ISSET( int fd, fd_set *fdset); void FD_SET( int fd, fd_set *fdset); //set bit trong *fdset ứng với fd void FD_ZERO(fd_set *fdset); // xóa tất cả bit trong fdset |
Nếu trả lại thành công, select trả lại số fds có dữ liệu sẵn sàng.
Nếu không thành công, select trả lại -1 và errno. Một số errno như sau:
- EBADF: có một fd không hợp lệ
- EINTR: select bị ngắt bởi tín hiệu trước khi timeout
- EINVAL: khoảng timeout không hợp lệ
Implementation của fdset dựa trên 1 bit mask kiểu số nguyên, hoặc bit fields trong mảng số nguyên.
Ví dụ sau về 1 hàm bị block cho tới khi 1 trong 2 fd sẵn sàng có dữ liệu.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| #include errno.h #include sys/select.h int whicisready( int fd1, int fd2) { int maxfd; int nfds; fd_set readset; if (fd1 < 0 || fd1 >= FD_SETSIZE || fd2 < 0 || fd2 >= FD_SETSIZE) { errno = EINVAL; return -1; } maxfd = (fd1 > fd2) ? fd1: fd2; FD_ZERO(&readset); FD_SET(fd1,&readset); FD_SET(fd2,&readset); ndfs = select(maxfd+1, &readset, NULL, NULL, NULL); if (ndfs == -1) return -1; if (FD_ISSET(fd1, &readset)) return fd1; if (FD_ISSET(fd2, &readset)) return fd2; errno = EINVAL; return -1; }
|
Không có nhận xét nào:
Đăng nhận xét