---
# System prepended metadata

title: Stack Limit

---

大多數 linux 系統預設的 stacklimit 都是 8192KB，我們可以用 `ulimit -s <stack size>` 來設定要更改的 stack size 數量。

但是如果使用 `ulimit -s unlimited` 來將 stack size 設為無限的話，在我的電腦（Pop! OS 22.04）上是會被禁止的，在前面加上 sudo 也不行，終端的輸出是這樣的

```bash
alanliang@pop-os:~/system-programming$ ulimit -s unlimited
bash: ulimit: stack size：不能修改 limit: 此項操作並不被允許
```

實際上我們應該修改 `/etc/security/limits.conf`，才能讓 stack size 變成 unlimited

```bash
<username> soft stack unlimited
<username> hard stack unlimited
```

在這樣設定並且重新開機後，就可以使用相當於實體記憶體大小的 stack 了，我寫了一個間單的程式來暴力的確定 stack size，需要注意的是，如果按照了以上步驟將 stack size 設為 unlimited，並運行以下程式，是會讓電腦當掉的。

```c
#include <stdio.h>

void stack_test(int depth, int *stack_start) {
    int trash[1024];
    long long stack_size = stack_start - trash;
    // printf("stack start: %p, stack current %p\n", stack_start, trash);

    printf("Depth: %d, Stack size: %lld bytes, %lld KB, %lld MB\n", depth, stack_size * sizeof(int), stack_size * sizeof(int) / 1024, stack_size * sizeof(int) / 1024 / 1024);

    stack_test(depth + 1, stack_start);
}

int main() {
    int stack_start;
    stack_test(1, &stack_start);
    return 0;
}
```

結果如下：
![P_20240609_092231](https://hackmd.io/_uploads/SyOYBofHC.jpg)

由於電腦已經當掉了，只能用手機拍照，可以從 htop 看到 Mem 的部分已經快被塞爆了。底下的程式輸出因為 overflow 因此顯示不正確，上面的程式碼已經修正這個問題了。


