【问题标题】:Obtaining the sig_int value from siginfo in boost::siginfo handler从 boost::siginfo 处理程序中的 siginfo 获取 sig_int 值
【发布时间】:2015-04-29 18:32:44
【问题描述】:

我有一个自定义信号,它通过以下方式从内核模块发送到用户空间。请注意,我在附加到信号的 si_int 结构参数中包含一个整数 (id),并且我已经知道我所针对的用户空间应用程序的 pid。

struct siginfo info;
memset(&info, 0, sizeof(struct siginfo));
info.si_signo = MY_CUSTOM_SIGNAL;
info.si_code = SI_QUEUE;        // Fake coming from user-space
info.si_int = id;               // Include some variable id
send_sig_info(MY_CUSTOM_SIGNAL, &info, pid);

在我的用户空间应用程序中,我通过以下方式监听信号:

boost::asio::io_service io;
boost::asio::signal_set signals(io, MY_CUSTOM_SIGNAL);
signals.async_wait(handler);
io.run();

...当它发生时调用这个处理程序...

void handler(const boost::system::error_code& error, int signal_number)
{
    // Do something with the signal
}

不幸的是,siginfo 没有传递到处理程序中,所以我无法确定内核模块分配的id 变量的值。有什么方法可以确定这个值吗?

【问题讨论】:

    标签: c++ linux boost-asio


    【解决方案1】:

    简而言之,没有。

    在存在sigaction() 的情况下,Boost.Asio 将其内部信号处理程序注册为sa_handler,并且不设置SA_SIGINFO 标志。因此,Boost.Asio 的信号处理程序永远不会收到与信号关联的siginfo_t,并且在完成async_wait() 操作时无法将其传播到用户的SignalHandler。以下是implementation的相关摘录:

    using namespace std; // For memset.
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = boost_asio_signal_handler;
    sigfillset(&sa.sa_mask);
    if (::sigaction(signal_number, &sa, 0) == -1)
    

    鉴于您最近关于 having a functor handle a signal 和 Boost.Asio 仅接收和传播 signum 的问题,可能值得考虑使用 self-pipe trick 实现您自己的信号处理程序。然而,当 Boost.Asio 仅在管道上 writesreads signum 时,可以写入和读取附加信息,例如 siginfo.si_int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多