c++ - 使用 sigaltstack 动态更改运行信号处理程序的堆栈

标签 c++ c++11 stack signals

我正在尝试发出 100 个信号 (SIGUSR1) 并让它们都在自己的堆栈中运行,有人可以解释一下我该怎么做吗?使用以下代码:

std::signal(SIGUSR1, signal_andler);

for (int i = 0; i < 100; ++i) {
    stack_t stack;
    stack.ss_flags = 0;
    stack.ss_size = FIBER_STACK;
    stack.ss_sp = malloc( FIBER_STACK );
    
    sigaltstack( &stack, 0 );
    
    raise( SIGUSR1 );
}

我在某处阅读了使用 sigaction 的其他实现,但我还是不知道那是什么。如果我完全误解了 sigaltstack 的工作原理,我深表歉意。

最佳答案

为了在备用堆栈上传递信号,您需要在注册信号处理程序时指定 SA_ONSTACK 标志:

struct sigaction act;
act.sa_handler = signal_handler;
act.sa_mask = 0;
act.sa_flags = SA_ONSTACK;
sigaction(SIGUSR1, &act, 0);

调用 signal 等同于使用 0 调用 sigaction 作为标志(不是你想要的)。

关于c++ - 使用 sigaltstack 动态更改运行信号处理程序的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34460357/

相关文章:

c++ - 可以将右值移动到 shared_ptr 中吗

c++ - 在 C++ 中,我们如何使用执行函数的有效 X(Args...) 语法调用所有内容?

amazon-web-services - 如何在 AWS 账户与外部服务或应用程序(不在 AWS 上)之间建立连接

c++ - 捕获vector.erase()

c++ - 宏是否使代码更具可读性?

c++ - 始终使用 CMake 运行测试用例

C 创建空栈时出错

c++ - 使用 atomic bool 保护进程

c++ - 将任意 lambda 表达式传递给函数?

c++ - 有什么方法可以在 visual studio C++ 中增加运行时的堆栈保留大小