Skip to content

Day49 - signalfd and epoll Graceful Shutdown

Goal

Add signal handling to an epoll-based server without using signal handlers.


Step 1 - Create signal mask

sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGTERM);

Step 2 - Block signals

sigprocmask(SIG_BLOCK, &mask, NULL);

Step 3 - Create signalfd

fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);

Step 4 - Add to epoll

Wrap as epoll_item:

item.type = EPOLL_ITEM_SIGNAL;
add_epoll_item(epfd, &item, EPOLLIN);

Step 5 - Handle event

read(signal_fd, &siginfo, sizeof(siginfo));

Step 6 - Shutdown

if (signal == SIGINT || SIGTERM)
    exit loop;

Step 7 - Cleanup

Release all resources after exiting event loop.


Testing

Ctrl+C

./server

Press:

Ctrl+C

Expected:

[SIGNAL] received signal=2
[INFO] Graceful shutdown requested

kill

kill -TERM <pid>

Expected:

signal=15

Result

  • No signal handler required
  • All logic handled inside epoll loop
  • Clean shutdown achieved