起因:在一段C++程序中使用sprintf函数,程序运行时挂掉了,看了半天觉得程序写得没啥毛病,单独把这段程序搂出来放在main函数里运行结果是正确的,经过大师的指点,怀疑时栈空间不够导致的,网上查了一些资料记录一下。
ulimit -a查看栈空间默认大小,一般为8192k即8MB
测试栈空间程序:
#include <stdio.h>
int testtack(int num)
{
int buff[num];
printf("num is %d\n", num);
return 0;
}
int main(int argc, char* argv[])
{
int buflen = 1 * 1024 * 1024;
for(; buflen < 8 * 1024 * 1024; buflen++)
testtack(buflen);
printf("hello, world");
return 0;
}
参考网址:https://blog.csdn.net/elfprincexu/article/details/78779158
1、进程栈大小是执行时随机确认的,至少比线程栈要大,但不会超过2倍;
线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改;
线程从进程栈分配空间,大小并不是固定的,如果分配空间大于进程栈空间,那么直接运行时出现段错误,每个线程拥有独立的栈空间,为了避免线程之间的栈空间踩踏,线程栈之间还会有以小块guardsize用来隔离保护各自的栈空间,一旦另一个线程踏入到这个隔离区,就会引发段错误。
参考网址:https://blog.csdn.net/liyuanyes/article/details/44097731
2、linux中主线程的栈空间要比子线程大,子线程可以使用的栈空间是stack size,而主线程能使用的栈空间要比子线程大很多(2M)
参考网址:https://www.linuxidc.com/Linux/2011-02/32385.htm
https://www.cnblogs.com/dongzhiquan/p/4141598.html