【发布时间】:2017-08-29 22:35:48
【问题描述】:
我正在使用套接字和系统调用编写自己的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?
【问题讨论】:
-
来自精品手册:
Normally, the set of signals to be received via the file descriptor should be blocked using sigprocmask(2), to prevent the signals being handled according to their default dispositions. -
谢谢,使用
sigprocmask解决了所有问题!