我正在使用套接字和系统调用编写自己的echo server
。我正在使用epoll
同时处理许多不同的客户端,并且使用客户端完成的所有操作都是非阻塞的。当服务器启动且不执行任何操作时,它处于epoll_wait
中。现在我想添加使用信号关闭服务器的可能性。例如,我在bash terminal
中启动服务器,然后按ctrl-c
,服务器就会以某种方式处理SIGINT
。我的计划是使用signalfd
。我使用以下代码创建新的signalfd
并将其添加到epoll
实例中:
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigaddset(&mask, SIGINT);
signal_fd = signalfd(-1, &mask, 0);
epoll_event event;
event.data.fd = signal_fd;
event.events = EPOLLIN;
epoll_ctl(fd, EPOLL_CTL_ADD, signal_fd, &event);
然后我期望,当epoll
在等待时,我按下ctrl-c
,epoll
上的事件发生,它被唤醒,然后我用以下代码处理信号:
if (events[i].data.fd == signal_fd)
{
//do something
exit(0);
}
尽管在现实中,服务器只是停止而不处理信号。我做错了什么,解决问题的正确方法是什么?如果我对信号的理解不正确,那么应该在哪里使用signalfd
https://stackoverflow.com/questions/43212106
复制相似问题