【Linux详解】进程等待 | 非阻塞轮询
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
int main() {
struct rlimit limit;
if (getrlimit(RLIMIT_NOFILE, &limit) < 0) {
perror("getrlimit");
return 1;
}
int nfds = limit.rlim_cur;
struct pollfd *fds = calloc(nfds, sizeof(struct pollfd));
if (fds == NULL) {
perror("calloc");
return 1;
}
// 假设我们要等待标准输入(fd = 0)上的输入事件
fds[0].fd = 0;
fds[0].events = POLLIN;
while (1) {
int timeout = 500; // 500毫秒
switch (poll(fds, 1, timeout)) {
case 0:
// 超时
printf("超时等待输入\n");
break;
case -1:
// 出错
perror("poll");
free(fds);
return 1;
default:
// 可读事件
if (fds[0].revents & POLLIN) {
char buffer[1024];
ssize_t bytes = read(0, buffer, sizeof(buffer) - 1);
if (bytes > 0) {
buffer[bytes] = '\0'; // 确保字符串结束
printf("读取到输入: %s\n", buffer);
}
}
break;
}
}
free(fds);
return 0;
}
这段代码使用了非阻塞轮询(polling)来等待标准输入的到来。它首先设置一个pollfd
结构体数组,用于注册我们关心的文件描述符和事件。然后,它使用poll
系统调用进行非阻塞等待。如果在指定的超时时间内有事件发生,poll
会返回并告诉我们哪些文件描述符上有什么事件发生。这种方式适合于编写简单的命令行应用程序,因为它不会阻塞当前进程,从而可以同时监视多个事件源。
评论已关闭