gpt4 book ai didi

c++ - 在 boost::siginfo 处理程序中从 siginfo 获取 sig_int 值

转载 作者:太空宇宙 更新时间:2023-11-04 03:40:17 24 4
gpt4 key购买 nike

我有一个自定义信号,它通过以下方式从内核模块发送到用户空间。请注意,我在附加到信号的 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 变量的值。有什么办法可以确定这个值吗?

最佳答案

简而言之,不。

sigaction()在场的情况下,Boost.Asio 将其内部信号处理程序注册为 sa_handler 并且不设置 SA_SIGINFO 标志。因此,Boost.Asio 的信号处理程序永远不会接收与信号关联的 siginfo_t,并且无法将其传播到用户的 SignalHandler完成 async_wait() 操作时。以下是 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

关于c++ - 在 boost::siginfo 处理程序中从 siginfo 获取 sig_int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29951773/

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