select和poll函数一般怎么使用,请举例
时间: 2024-09-10 22:21:50 浏览: 39
`select()` 和 `poll()` 都是在POSIX系统中用于等待文件描述符集合中的某个事件发生的原生函数,它们常用于网络编程,特别是非阻塞I/O场景。
1. **select()** 函数:
- 该函数接受四个参数:读端口描述符数组、写端口描述符数组、错误描述符数组以及一个超时时间(毫秒)。如果在指定的时间内有至少一个描述符变为可读或可写,则返回true,否则返回false。
- 示例:
```c
int descriptors[] = {socket_fd, file_desc};
fd_set read_fds, write_fds;
FD_ZERO(&read_fds);
FD_SET(socket_fd, &read_fds); // 监听socket_fd是否可读
FD_SET(file_desc, &write_fds); // 监听file_desc是否可写
timeout.tv_sec = 0; // 不设置超时
timeout.tv_usec = 1000; // 设置最多等待1s
if (select(nfds, &read_fds, &write_fds, NULL, &timeout) > 0) {
// 检查描述符状态并处理相应的IO操作
}
```
2. **poll()** 函数:
- poll() 更灵活,可以同时监控多个描述符,并提供自定义的时间间隔,支持负数超时值表示无限等待。
- 参数包括:指向`struct pollfd`数组的指针(每个结构体包含描述符、事件类型及数据),数组大小,以及超时毫秒数(负数表示无限等待)。
- 示例:
```c
struct pollfd fds[2];
fds[0].fd = socket_fd;
fds[0].events = POLLIN; // 监听读事件
fds[1].fd = file_desc;
fds[1].events = POLLOUT; // 监听写事件
int timeout_millis = 500; // 等待500ms
if (poll(fds, 2, timeout_millis) > 0) {
for (int i = 0; i < 2; i++) {
if (fds[i].revents & (POLLIN | POLLOUT)) {
// 根据事件类型处理相应IO操作
}
}
}
```
阅读全文