首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在boost::siginfo处理程序中从siginfo获取sig_int值

在boost::siginfo处理程序中从siginfo获取sig_int值
EN

Stack Overflow用户
提问于 2015-04-29 18:32:44
回答 1查看 425关注 0票数 0

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

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
boost::asio::io_service io;
boost::asio::signal_set signals(io, MY_CUSTOM_SIGNAL);
signals.async_wait(handler);
io.run();

..。这个处理程序在发生时会被调用..。

代码语言:javascript
复制
void handler(const boost::system::error_code& error, int signal_number)
{
    // Do something with the signal
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 20:16:49

总之,没有。

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

代码语言:javascript
复制
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)

考虑到您最近关于有一个函子处理一个信号和Boost.Asio只接收和传播signum的问题,可能值得考虑使用自管戏法实现您自己的信号处理程序。但是,由于管道上只有Boost.Asio和阅读数 signum,因此可以写入和读取其他信息,如siginfo.si_int

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

https://stackoverflow.com/questions/29951773

复制
相关文章

相似问题

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