给个epoll监听文件变化的代码示例
时间: 2024-01-22 22:04:18 浏览: 126
下面是一个使用 epoll 监听文件变化的简单示例代码:
```c
#include <sys/epoll.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_EVENTS 10
#define BUF_SIZE 1024
int main() {
int epoll_fd, fd, num_events;
struct epoll_event ev, events[MAX_EVENTS];
char buf[BUF_SIZE];
// 创建 epoll 对象
epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
// 打开需要监听的文件
fd = open("test.txt", O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 添加文件描述符到 epoll 对象中
ev.events = EPOLLIN;
ev.data.fd = fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}
while (1) {
// 等待事件发生
num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (num_events == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}
// 处理事件
for (int i = 0; i < num_events; i++) {
if (events[i].events & EPOLLIN) {
// 文件可读,读取数据并打印
int n = read(events[i].data.fd, buf, BUF_SIZE);
if (n == -1) {
perror("read");
exit(EXIT_FAILURE);
}
printf("read %d bytes from file: %.*s\n", n, n, buf);
}
}
}
// 关闭文件和 epoll 对象
close(fd);
close(epoll_fd);
return 0;
}
```
在上面的代码中,我们使用 epoll 监听了一个文件 "test.txt",并在文件可读时读取数据并打印。可以通过修改文件内容来测试文件变化的监听效果。
阅读全文