【发布时间】: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