1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| #include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_EVENTS 10
int main() {
int epoll_fd, file_fd, stdin_fd;
struct epoll_event event, events[MAX_EVENTS];
// 1. Create epoll instance
epoll_fd = epoll_create1(0);
if (epoll_fd == -1) {
perror("epoll_create1 failed");
exit(EXIT_FAILURE);
}
// 2. Register STDIN file descriptor
stdin_fd = STDIN_FILENO;
event.events = EPOLLIN; // Read event
event.data.fd = stdin_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, stdin_fd, &event) == -1) {
perror("epoll_ctl failed for stdin");
exit(EXIT_FAILURE);
}
// 3. Register file descriptor
file_fd = open("example.txt", O_RDONLY);
if (file_fd == -1) {
perror("Failed to open file");
exit(EXIT_FAILURE);
}
event.events = EPOLLIN; // Read event
event.data.fd = file_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, file_fd, &event) == -1) {
perror("epoll_ctl failed for file");
exit(EXIT_FAILURE);
}
// 4. Wait for events
printf("Waiting for events...\n");
while (1) {
int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (n == -1) {
perror("epoll_wait failed");
exit(EXIT_FAILURE);
}
// 5. Handle events
for (int i = 0; i < n; i++) {
if (events[i].data.fd == stdin_fd) {
printf("Readable event on stdin\n");
char buffer[256];
ssize_t count = read(stdin_fd, buffer, sizeof(buffer));
if (count > 0) {
buffer[count] = '\0';
printf("Input: %s", buffer);
}
} else if (events[i].data.fd == file_fd) {
printf("Readable event on file\n");
char buffer[256];
ssize_t count = read(file_fd, buffer, sizeof(buffer));
if (count > 0) {
buffer[count] = '\0';
printf("File content: %s", buffer);
}
}
}
}
// 6. Clean up resources
close(file_fd);
close(epoll_fd);
return 0;
}
|