当前位置:   article > 正文

Linux 栈空间限制 (ulimit -a指令查看限制)(我的ubuntu下每个线程最多只能申请8M栈空间)(ulimit -s)_ubuntu ulimit

ubuntu ulimit

参考文章:Linux程序栈空间是多大?

我的测试代码:
开启两个线程,每个线程每秒申请1M的栈空间

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void testStackSize(int index)
{
    char localValArr[1024*1024] = {0};
    index++;
    printf("%s %d num = %d!\n", __FUNCTION__, __LINE__, index);
    sleep(1);
    testStackSize(index);
}

void *threadEntry(void *arg)
{
    printf("%s %d!\n", __FUNCTION__, __LINE__);
    printf("New process:  PID: %d,TID: %lu.\n",getpid(),pthread_self());
    testStackSize(0);
    pthread_exit(NULL);
}

int main(int argc, char **argv)
{
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1, NULL, threadEntry, NULL);
    pthread_create(&thread2, NULL, threadEntry, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

ubuntu上编译运行:

[root@ubuntu /arnold_test/test]37# gcc test_stack.c -lpthread
[root@ubuntu /arnold_test/test]38# 
[root@ubuntu /arnold_test/test]38# ./a.out 
threadEntry 17!
New process:  PID: 35664,TID: 140456138036992.
threadEntry 17!
New process:  PID: 35664,TID: 140456129644288.
testStackSize 10 num = 1!
testStackSize 10 num = 1!
testStackSize 10 num = 2!
testStackSize 10 num = 2!
testStackSize 10 num = 3!
testStackSize 10 num = 3!
testStackSize 10 num = 4!
testStackSize 10 num = 4!
testStackSize 10 num = 5!
testStackSize 10 num = 5!
testStackSize 10 num = 6!
testStackSize 10 num = 6!
testStackSize 10 num = 7!
testStackSize 10 num = 7!
段错误 (核心已转储)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

测试发现,当每个线程申请到8M(以先申请到的为准)栈空间的时候,就会core dump(吐核)

ulimit -a查看我系统栈空间的限制:发现栈空间限制为8192kb,就是说每个线程最多只能申请8M的栈空间

[root@ubuntu /arnold_test/test]40# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15445
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15445
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

20230412 函数中定义一个很大的数组,导致栈空间不足的问题

我的C++函数void MediaHTTPServer::ky_ai_http_cb(struct evhttp_request req, void arg)里有一个char buf[BUF_MAX] = {0};const static int BUF_MAX = 8*1024*1024;,我一调用这个函数程序就段错误

然后我把char buf[BUF_MAX] = {0};改成:

static char buf[BUF_MAX] = {0};
memset(buf, 0, BUF_MAX);
  • 1
  • 2

就好了。

解释:
这个段错误是由于栈溢出引起的。在函数中定义一个很大的数组,会导致栈空间不足,从而导致段错误。可以尝试将buf数组改为动态分配内存,例如使用malloc函数,这样可以避免栈溢出的问题。另外,也可以尝试减小BUF_MAX的值,以减少内存的使用。或者可以将buf数组定义为全局变量或静态变量,这样可以避免栈溢出的问题,但是需要注意全局变量和静态变量会占用程序的静态存储区,可能会导致程序的内存占用过大。

使用ulimit -s命令能查看当前进程的栈大小限制。

我在我ubuntu20.04虚拟机上看,是这样:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/428751
推荐阅读
相关标签
  

闽ICP备14008679号