首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SIGTERM记录消息

从SIGTERM记录消息
EN

Stack Overflow用户
提问于 2012-10-03 20:56:05
回答 2查看 917关注 0票数 2

当应用程序(在我的例子中是C++守护进程)收到SIGTERM或SIGINT时,记录关机消息的正确方式是什么?

根据CERTsignal(7) manpage的说法,从信号处理程序调用许多函数(可能包括大多数日志库使用的函数)是不安全的。

EN

回答 2

Stack Overflow用户

发布于 2013-04-27 22:18:21

今年早些时候,Vlad Lazarenko在这个话题上写了一个很棒的blog post。在Linux上,它归结为使用signalfd(2)创建信号描述符,并使用poll(2)epoll_wait(2)等事件循环。下面是Vlad从描述符中读取的示例

代码语言:javascript
复制
#include <sys/signalfd.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define handle_error(msg)                               \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
    sigset_t mask;
    int sfd;
    struct signalfd_siginfo fdsi;
    ssize_t s;

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

    /* Block signals so that they aren't handled
       according to their default dispositions */

    if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
        handle_error("sigprocmask");

    sfd = signalfd(-1, &mask, 0);
    if (sfd == -1)
        handle_error("signalfd");

    for (;;) {
        s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
        if (s != sizeof(struct signalfd_siginfo))
            handle_error("read");

        if (fdsi.ssi_signo == SIGINT) {
            printf("Got SIGINT\n");
        } else if (fdsi.ssi_signo == SIGQUIT) {
            printf("Got SIGQUIT\n");
            exit(EXIT_SUCCESS);
        } else {
            printf("Read unexpected signal\n");
        }
    }
}

此示例可以很容易地扩展为集成到事件循环中。

票数 1
EN

Stack Overflow用户

发布于 2013-04-27 22:05:34

日志记录不是从处理程序中完成的,而是在它之后完成的:

代码语言:javascript
复制
int received_sigterm = 0;

void
sigterm_handler(int sig)
{
  received_sigterm = 1;
}

void
loop(void)
{
  for(;;) {
    sleep(1);
    if (received_sigterm)
      log("finish\n");
  }
}

int
main()
{
  log("start\n");
  signal(SIGTERM, sigterm_handler);
  loop();
}

这个概念借鉴自openssh-6.1源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12708984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档