【问题标题】:how to dynamically increase the stack size of a process如何动态增加进程的堆栈大小
【发布时间】:2017-08-12 04:15:49
【问题描述】:

您好,我正在尝试实现一个进程,该进程通过处理(溢出/分段错误)异常来动态增加其可用堆栈。

我在这里编写一个示例程序,通过在堆栈上递归分配空间并因此增长堆栈直到它给出一个 SIGSEGV,我在处理程序中处理此异常并通过使用 getrlimit 和 setrlimit 增加进程的资源限制,这似乎不起作用,我不知道为什么,如果我尝试通过 raise() 以编程方式生成 SIGSEGV 来做同样的事情, 我能够增加堆栈大小,这是我正在使用的代码

    #include<unistd.h>
    #include<sys/resource.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<signal.h>
    #include<sys/time.h>
    void allocate(void);
    void handler(int sig)
    {
    struct rlimit r;
    getrlimit(RLIMIT_STACK,&r);
    r.rlim_cur=r.rlim_cur *5; // increasing stack size five times
    setrlimit(RLIMIT_STACK,&r);
    write(1,"Handler",7);  //to check handler invocation
    //signal(SIGSEGV,SIG_DFL);
    }

    int cntz=0xfff; //for adusting recursion

    int main()
    {
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;
    sa.sa_handler=handler;
    sigaction(SIGSEGV,&sa,NULL);
    //raise(SIGSEGV);    to raise self signal to increase stack size 
    allocate();
    //getchar();
    exit(1);

    } 

    void allocate()
    {
    char staczzk[5000];  //allocating memory on stack in each 
    recursive call
    cntz--;
    printf("%d\n",cntz);
    if (cntz==0)
    return;
    allocate();    //recusrive call
    }

【问题讨论】:

  • 尝试在Stack Clash 修正后设置rlimit_stack 可能会导致失败或相关问题。另请参阅红帽 Issue 1463241

标签: linux stack signals stack-overflow


【解决方案1】:

默认情况下,您的信号处理程序将使用与程序其余部分相同的堆栈,并且由于对allocate 的所有调用,没有剩余堆栈空间。

解决方法是使用备用信号堆栈。以下内容基于您的代码以及来自sigaltstack man page 的代码:

int main()
{
    struct sigaction sa;
    stack_t ss;

    ss.ss_sp = malloc(SIGSTKSZ);
    if (ss.ss_sp == NULL) { perror("malloc"); exit(1); }
    ss.ss_size = SIGSTKSZ;
    ss.ss_flags = 0;
    if (sigaltstack(&ss, NULL) == -1) { perror("sigaltstack"); exit(1); }

    sigemptyset(&sa.sa_mask);
    sa.sa_flags=SA_ONSTACK;
    sa.sa_handler=handler;
    if(sigaction(SIGSEGV,&sa,NULL)<0) { perror("sigaction"); exit(1); }
    //raise(SIGSEGV);    to raise self signal to increase stack size
    allocate();
    exit(1);
}

【讨论】:

猜你喜欢
  • 2015-11-22
  • 2013-12-24
  • 2011-09-29
  • 2010-11-24
  • 2021-03-17
  • 2018-01-17
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多