select
阻塞基础概念select
是 Linux 系统中用于 I/O 多路复用的一个系统调用。它允许单个进程/线程处理多个 I/O 操作,通过检查多个文件描述符(例如套接字)的状态来决定是否可以进行 I/O 操作。当使用 select
时,如果没有文件描述符准备好,调用会阻塞,直到至少有一个文件描述符准备好为止。
select
调用都会返回。问题:select
调用长时间阻塞,影响程序响应性。
原因:
以下是一个简单的 select
使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>
int main() {
fd_set read_fds;
struct timeval timeout;
FD_ZERO(&read_fds);
FD_SET(STDIN_FILENO, &read_fds); // 监听标准输入
timeout.tv_sec = 5;
timeout.tv_usec = 0;
int ret = select(STDIN_FILENO + 1, &read_fds, NULL, NULL, &timeout);
if (ret == -1) {
perror("select error");
return 1;
} else if (ret == 0) {
printf("select timeout\n");
} else {
if (FD_ISSET(STDIN_FILENO, &read_fds)) {
char buffer[1024];
fgets(buffer, sizeof(buffer), stdin);
printf("Received input: %s", buffer);
}
}
return 0;
}
这个示例程序监听标准输入,如果在5秒内有输入,则读取并打印;否则,输出超时信息。
领取专属 10元无门槛券
手把手带您无忧上云