From 4121154e217e93bcda295fa8867ce0868cfbaf5a Mon Sep 17 00:00:00 2001 From: ruinivist Date: Sun, 11 Jan 2026 20:11:25 +0000 Subject: [PATCH] older epoll impl --- hello-epoll/Makefile | 13 +++ hello-epoll/hello-epoll | Bin 0 -> 16624 bytes hello-epoll/hello-epoll.cpp | 152 ++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+) create mode 100644 hello-epoll/Makefile create mode 100755 hello-epoll/hello-epoll create mode 100644 hello-epoll/hello-epoll.cpp diff --git a/hello-epoll/Makefile b/hello-epoll/Makefile new file mode 100644 index 0000000..763aa71 --- /dev/null +++ b/hello-epoll/Makefile @@ -0,0 +1,13 @@ +CXX = g++ +CXXFLAGS = -Wall -Wextra -std=c++11 +TARGET = hello-epoll + +all: $(TARGET) + +$(TARGET): hello-epoll.cpp + $(CXX) $(CXXFLAGS) -o $(TARGET) hello-epoll.cpp + +clean: + rm -f $(TARGET) + +.PHONY: all clean diff --git a/hello-epoll/hello-epoll b/hello-epoll/hello-epoll new file mode 100755 index 0000000000000000000000000000000000000000..5c970f5a576e59fd31d2c6a95195f4a93a8366a7 GIT binary patch literal 16624 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 literal 0 HcmV?d00001 diff --git a/hello-epoll/hello-epoll.cpp b/hello-epoll/hello-epoll.cpp new file mode 100644 index 0000000..458f229 --- /dev/null +++ b/hello-epoll/hello-epoll.cpp @@ -0,0 +1,152 @@ +#include +#include +#include +#include + +#include +#include +#include + +#define MAX_EVENTS 10 +#define BUFFER_SIZE 1024 +#define FIFO_PATH "/tmp/hello_epoll_fifo" + +int main() { + int epoll_fd, stdin_fd, fifo_fd; + struct epoll_event ev, events[MAX_EVENTS]; + char buffer[BUFFER_SIZE]; + + // Create a named pipe (FIFO) + unlink(FIFO_PATH); // Remove if it already exists + if (mkfifo(FIFO_PATH, 0666) == -1) { + std::cerr << "Error creating FIFO: " << strerror(errno) << std::endl; + return 1; + } + std::cout << "Created FIFO at: " << FIFO_PATH << std::endl; + std::cout << "From another terminal, run: echo 'Hello from FIFO' > " << FIFO_PATH << std::endl; + std::cout << "----------------------------------------" << std::endl; + + // Create epoll instance + epoll_fd = epoll_create1(0); + if (epoll_fd == -1) { + std::cerr << "Error creating epoll: " << strerror(errno) << std::endl; + unlink(FIFO_PATH); + return 1; + } + + // Set stdin to non-blocking mode + stdin_fd = STDIN_FILENO; + int flags = fcntl(stdin_fd, F_GETFL, 0); + fcntl(stdin_fd, F_SETFL, flags | O_NONBLOCK); + + // Add stdin to epoll + ev.events = EPOLLIN; + ev.data.fd = stdin_fd; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, stdin_fd, &ev) == -1) { + std::cerr << "Error adding stdin to epoll: " << strerror(errno) << std::endl; + close(epoll_fd); + unlink(FIFO_PATH); + return 1; + } + std::cout << "Added stdin (fd=" << stdin_fd << ") to epoll" << std::endl; + + // Open FIFO in non-blocking mode for reading + fifo_fd = open(FIFO_PATH, O_RDONLY | O_NONBLOCK); + if (fifo_fd == -1) { + std::cerr << "Error opening FIFO: " << strerror(errno) << std::endl; + close(epoll_fd); + unlink(FIFO_PATH); + return 1; + } + + // Add FIFO to epoll + ev.events = EPOLLIN; + ev.data.fd = fifo_fd; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev) == -1) { + std::cerr << "Error adding FIFO to epoll: " << strerror(errno) << std::endl; + close(fifo_fd); + close(epoll_fd); + unlink(FIFO_PATH); + return 1; + } + std::cout << "Added FIFO (fd=" << fifo_fd << ") to epoll" << std::endl; + std::cout << "----------------------------------------" << std::endl; + std::cout << "Waiting for events... (type 'quit' to exit)" << std::endl; + std::cout << std::endl; + + // Event loop + bool running = true; + while (running) { + int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); + if (nfds == -1) { + std::cerr << "Error in epoll_wait: " << strerror(errno) << std::endl; + break; + } + + // Process all ready file descriptors + for (int i = 0; i < nfds; i++) { + int fd = events[i].data.fd; + + if (events[i].events & EPOLLIN) { + ssize_t bytes_read = read(fd, buffer, BUFFER_SIZE - 1); + + if (bytes_read > 0) { + buffer[bytes_read] = '\0'; + + if (fd == stdin_fd) { + std::cout << "[STDIN] Received: " << buffer; + + // Check for quit command + if (strncmp(buffer, "quit", 4) == 0) { + running = false; + break; + } + } else if (fd == fifo_fd) { + std::cout << "[FIFO] Received: " << buffer; + } + } else if (bytes_read == 0) { + // EOF - for FIFO, this happens when writer closes + if (fd == fifo_fd) { + std::cout << "[FIFO] Writer closed, reopening..." << std::endl; + close(fifo_fd); + + // Reopen FIFO + fifo_fd = open(FIFO_PATH, O_RDONLY | O_NONBLOCK); + if (fifo_fd == -1) { + std::cerr << "Error reopening FIFO: " << strerror(errno) << std::endl; + running = false; + break; + } + + // Re-add to epoll + ev.events = EPOLLIN; + ev.data.fd = fifo_fd; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fifo_fd, &ev) == -1) { + std::cerr << "Error re-adding FIFO to epoll: " << strerror(errno) << std::endl; + running = false; + break; + } + } + } else { + // Error reading + if (errno != EAGAIN && errno != EWOULDBLOCK) { + std::cerr << "Error reading from fd " << fd << ": " << strerror(errno) << std::endl; + } + } + } + + if (events[i].events & (EPOLLERR | EPOLLHUP)) { + std::cerr << "Error/Hangup on fd " << fd << std::endl; + } + } + } + + // Cleanup + std::cout << std::endl + << "Cleaning up..." << std::endl; + close(fifo_fd); + close(epoll_fd); + unlink(FIFO_PATH); + + return 0; +}