gpt4 book ai didi

linux - 如何动态增加进程的堆栈大小

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

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

我在这里编写了一个示例程序,通过递归地在堆栈上分配空间并因此增加堆栈直到它给出 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
}

最佳答案

默认情况下,您的信号处理程序将使用与程序其余部分相同的堆栈,并且由于对 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);
}

关于linux - 如何动态增加进程的堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42911165/

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