gpt4 book ai didi

c - 使用 epoll_wait 和 signalfd 处理信号

转载 作者:行者123 更新时间:2023-12-02 05:07:43 27 4
gpt4 key购买 nike

我正在使用套接字和系统调用编写自己的echo 服务器。我使用 epoll 同时与许多不同的客户端一起工作,并且与客户端完成的所有操作都是非阻塞的。当服务器开启且不执行任何操作时,它处于 epoll_wait 状态。现在我想添加使用信号关闭服务器的可能性。例如,我在 bash 终端 中启动服务器,然后按 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?

最佳答案

epoll_wait 当被信号中断时返回 -1errno == EINTR。在这种情况下,您需要从 signal_fd读取

将信号的信号处理程序设置为 SIG_IGN,否则信号可能会终止您的应用程序。

参见man signal 7 :

The following interfaces are never restarted after being interrupted by a signal handler, regardless of the use of SA_RESTART; they always fail with the error EINTR when interrupted by a signal handler:

  • File descriptor multiplexing interfaces: epoll_wait(2), epoll_pwait(2), poll(2), ppoll(2), select(2), and pselect(2).

关于c - 使用 epoll_wait 和 signalfd 处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com