Segmentation-Fault

使用 pthread 的無限堆棧大小

  • November 20, 2020

我的預設堆棧大小(根據 ulimit -s)是 8192 kB,所以當我嘗試執行它時,下面的程式碼自然會出現段錯誤。此外,自然地,如果我執行“ulimit -s 9000”,它也可以正常工作。但是,當我執行“ulimit -s unlimited”時,程式碼會再次出現段錯誤。有什麼想法嗎?

如果有用,我正在執行核心 4.19.0-6 和 gcc 版本 Debian 8.3.0-6 的 Debian 10。

#include <iostream>
#include <unistd.h>
#include <cstdlib>

void* wait_exit(void*)
{
 char bob[8193*1024];
 return 0;
}

int main()
{
 pthread_t t_exit;
 int ret;
 
 if((ret = pthread_create(&t_exit,NULL,wait_exit,NULL)) !=0)
 {
   std::cout<<"Cannot create exit thread: "<<ret<<std::endl;
 }
 std::cout<<"Made thread"<<std::endl;
 sleep(5);
 return 0;
}

因為對於執行緒“無限”在 x86_64 上只為您提供 2 MiB,請參閱pthread_create 手冊頁

If the RLIMIT_STACK resource limit is set to "unlimited", a per-architecture value is used 
for the stack size.  Here is the value for a few architectures:

             ┌─────────────┬────────────────────┐
             │Architecture │ Default stack size │
             ├─────────────┼────────────────────┤
             │i386         │               2 MB │
             ├─────────────┼────────────────────┤
             │IA-64        │              32 MB │
             ├─────────────┼────────────────────┤
             │PowerPC      │               4 MB │
             ├─────────────┼────────────────────┤
             │S/390        │               2 MB │
             ├─────────────┼────────────────────┤
             │Sparc-32     │               2 MB │
             ├─────────────┼────────────────────┤
             │Sparc-64     │               4 MB │
             ├─────────────┼────────────────────┤
             │x86_64       │               2 MB │
             └─────────────┴────────────────────┘

引用自:https://unix.stackexchange.com/questions/620720