linux下栈空间大小
第一次写博客,很多地方写的不好请多见谅,希望这篇文章对大家有帮助。
首先说下为什么会写linux下栈空间大小这个内容。在评审同事代码的时候发现代码中有两个函数互相调用,且无法退出导致申请的栈内存无法释放,因此要计算能支持多少次循环。其实这个问题不是太难,只要知道栈空间大小,再除去申请的局部变量大小即可。
1、如何查看栈空间大小
对于 x86 和 x64 计算机,默认堆栈大小为 1 MB。在 Itanium 芯片组上,默认大小为 4 MB。linux下默认的堆栈空间大小是8M或10M,不同的发行版本可能不太一样。可以使用ulimit指令查看栈空间大小,指令ulimit -s或者ulimit -a如下图:
使用ulimit -s直接显示出栈空间大小10240,ulimit -a显示所有参数,其中stack size值是10240,表示栈空间大小是10M。注意:这里的单位是KB。我们也可以使用“ulimit -s 数字”来修改栈的大小,如下图将栈空间修改成8M:
#include
#include
void test(int i)
{
char temp[1024*1024] = {0};
temp[0] = i;
temp[0] ++;
printf("%s %d num = %d!\r\n", __FUNCTION__, __LINE__, temp[0]);
test(temp[0]);
}
int main(void)
{
test(0);
return 0;
}
我们先查找栈空间大小,再编译运行,如下:
#include
#include
#include
#include
pthread_t thread_id;
void test(int i)
{
char temp[1024*1024] = {0};
temp[0] = i;
temp[0] ++;
printf("%s %d num = %d!\r\n", __FUNCTION__, __LINE__, temp[0]);
test(temp[0]);
}
void *thrd_func(void *arg)
{
printf("%s %d!\r\n", __FUNCTION__, __LINE__);
printf("New process: PID: %d,TID: %u.\r\n",getpid(),pthread_self());
printf("New process: PID: %d,TID: %u.\r\n",getpid(),thread_id);
test(0);
pthread_exit(NULL); //退出线程
}
int main(void)
{
if (pthread_create(&thread_id,NULL,thrd_func,NULL)!=0)
{
printf("Create thread error!\r\n");
exit(1);
}
usleep(10000); //此处一定要加延时,否则子线程还没跑完主线程就结束了。
return 0;
}
运行并编译,结果: