【发布时间】:2020-04-24 12:51:07
【问题描述】:
我正在尝试使用我的程序找到我的最大堆栈大小。我知道,在我的操作系统上,堆栈的最大大小是 8MB。所以我试图进行无限循环,直到它导致分段错误。然后我需要打破这个循环,这样我就可以计算大小。我怎样才能做到这一点? SIGSEGV 信号后有没有办法打破无限循环?
static void handler(int signo)
{
if(signo == SIGSEGV)
{
printf("Waoh, caught signal\n");
}
}
int main()
{
int counter = 8964;
stack_t sigstack;
sigstack.ss_sp = malloc(SIGSTKSZ);
if( sigstack.ss_sp == NULL)
{
printf("Err: malloc error\n");
exit(EXIT_FAILURE);
}
sigstack.ss_size = SIGSTKSZ;
sigstack.ss_flags = 0;
if(sigaltstack(&sigstack, NULL) == -1)
{
printf("Err: sigaltstack error\n");
exit(EXIT_FAILURE);
}
struct sigaction act;
act.sa_flags = SA_ONSTACK;
sigemptyset(&act.sa_mask);
act.sa_handler = handler;
sigaction(SIGSEGV, &act, NULL);
do
{
char a[counter];
counter += 8964;
} while (1);
return 0;
}
【问题讨论】:
-
您可以在信号处理程序中
_exit()打破循环 -
然后我需要打破这个循环,这样我才能计算大小。我不想终止我的程序。之后我需要恢复。这就是为什么我需要打破这个循环。
-
在循环之前分叉,然后通过管道或类似的东西将结果传输到主程序。您也可以尝试使用
setjmp/longjmp进行恢复,但我会尽量避免这种情况...... -
天哪,我怎么没想到。谢谢。