poll
是 Linux 系统中用于 I/O 多路复用的系统调用,它允许进程监视多个文件描述符,等待其中任何一个变为可读、可写或有异常条件待处理。当没有文件描述符就绪时,poll
会阻塞,直到有文件描述符就绪或者超时发生。
poll
的优势poll
是 POSIX 标准的一部分,因此在大多数 Unix-like 系统上都可以使用。poll
调用设置超时时间。poll
只在必要时唤醒进程,减少了 CPU 的使用。poll
主要有两种使用类型:
poll
会一直阻塞,直到至少有一个文件描述符就绪或者超时。poll
会立即返回,即使没有文件描述符就绪。poll
的延时通常是由以下几个因素造成的:
poll
调用中设置了超时时间,那么 poll
最多会阻塞这个时间长度。poll
可能会因为内核调度延迟而比预期晚返回。poll
会一直阻塞,直到超时。epoll
(Linux 特有),它在处理大量文件描述符时性能更好。poll
可以减少不必要的阻塞。以下是一个简单的 poll
使用示例,设置了一个超时时间为 5000 毫秒(5 秒):
#include <poll.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
struct pollfd fds[1];
int timeout = 5000; // 超时时间设置为5000毫秒
// 初始化文件描述符集
fds[0].fd = STDIN_FILENO; // 标准输入
fds[0].events = POLLIN; // 关注可读事件
// 调用poll
int ret = poll(fds, 1, timeout);
if (ret == -1) {
perror("poll");
exit(EXIT_FAILURE);
} else if (ret == 0) {
printf("poll超时,没有数据可读\n");
} else {
if (fds[0].revents & POLLIN) {
char buf[1024];
ssize_t n = read(fds[0].fd, buf, sizeof(buf));
if (n > 0) {
printf("读取到数据: %s\n", buf);
}
}
}
return 0;
}
在这个示例中,程序会等待标准输入有数据可读,或者等待 5 秒后超时。如果超时发生,程序会打印一条消息说明没有数据可读。
领取专属 10元无门槛券
手把手带您无忧上云