从零写OS(二十六):poll —— 同时等待多个 fd

上一章实现了 TTY 输入,但用户程序只能这样等输入: .read_loop: syscall SYS_READ(fd=0, buf, 64) cmp rax, 0 jle .read_loop 问题很明显: CPU 全速空转:没有输入时 SYS_READ 每次返回 0,进程白白占用 CPU 无法同时等多个 fd:如果既要等 stdin,又要等 pipe,必须串行轮询,任一 fd 都可能饿死 poll 解决这两个问题。 poll 是什么 poll(fds[], nfds, timeout) 是一个系统调用: 传入一组 pollfd_t 结构,每个描述"我关心 fd X 的什么事件" 内核检查每个 fd 是否满足条件 返回就绪的 fd 数量,并在 revents 里标记哪些事件发生了 struct pollfd { int fd; // 监听哪个 fd short events; // 关心:POLLIN(可读)/ POLLOUT(可写) short revents; // 内核填写:实际发生了什么 }; int poll(struct pollfd *fds, int nfds, int timeout_ms); 有了 poll,程序可以: poll([{fd=0, POLLIN}, {fd=pipe_r, POLLIN}], 2, -1) → 等到任意一个有数据,才返回 实现架构 整体分四层: ...

May 14, 2026 · 3 min · 大飞
京ICP备14031575号-3