diff --git a/webserv/main.cpp b/webserv/main.cpp index 775b042..4dcdf04 100644 --- a/webserv/main.cpp +++ b/webserv/main.cpp @@ -7,6 +7,7 @@ #include // for ios_base #include // for allocator, basic_string, char_traits, operator+, string #include // for vector +#include int main(int argc, char **argv) { @@ -37,6 +38,7 @@ int main(int argc, char **argv) Log::debug("ConfigManager initialized successfully."); Server server(configManager); + ::signal(SIGINT, Server::signalHandler); server.run(); return 0; } \ No newline at end of file diff --git a/webserv/server/Server.cpp b/webserv/server/Server.cpp index 05ca6a7..f3b91e8 100644 --- a/webserv/server/Server.cpp +++ b/webserv/server/Server.cpp @@ -25,9 +25,12 @@ #include // for send, SOMAXCONN #include // for ssize_t #include // for close +#include class Router; +volatile sig_atomic_t Server::stop_ = 0; + Server::Server(const ConfigManager &configManager) : epoll_fd_(epoll_create1(O_CLOEXEC)), configManager_(configManager) { Log::trace(LOCATION); @@ -269,6 +272,11 @@ void Server::handleEpoll(struct epoll_event *events, int max_events) int nfds = epoll_wait(epoll_fd_, events, max_events, 10); // NOLINT if (nfds == -1) { + if (errno == EINTR) + { + Log::debug("epoll_wait interrupted by signal, continuing..."); + return; + } Log::error("epoll_wait failed"); throw std::runtime_error("epoll_wait failed"); } @@ -306,8 +314,22 @@ void Server::run() struct epoll_event events[MAX_EVENTS]; // NOLINT while (true) { + if (stop_ != 0) + { + Log::info("Server stopping..."); + break; + } pollSockets(); pollClients(); handleEpoll(events, MAX_EVENTS); // NOLINT (cppcoreguidelines-pro-bounds-pointer-arithmetic) } +} + +void Server::signalHandler(int signum) +{ + + if (signum == SIGINT) + { + stop_ = signum; + } } \ No newline at end of file diff --git a/webserv/server/Server.hpp b/webserv/server/Server.hpp index efe1ca6..7c2d26c 100644 --- a/webserv/server/Server.hpp +++ b/webserv/server/Server.hpp @@ -7,6 +7,7 @@ #include #include // for ServerSocket +#include #include // for uint32_t #include // for unique_ptr #include // for set @@ -31,6 +32,7 @@ class Server Server &operator=(Server &&other) noexcept = delete; ~Server(); + static void signalHandler(int signum); void run(); void add(ASocket &socket, Client *client = nullptr); @@ -44,6 +46,7 @@ class Server private: int epoll_fd_; + static volatile sig_atomic_t stop_; const ConfigManager &configManager_; std::vector> listeners_; std::set listener_fds_;