关于LINUX下进程栈的问题

发布于 2022-10-15 09:21:33 字数 1029 浏览 30 评论 0

我设置的堆栈大小是10M,机器是CENTOS 5.4 32BIT
[root@localhost test]# 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) 8192
max locked memory (kbytes, -l) 32
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) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 8192
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

但是在测试过程中,居然能够分配11M多的内存,求高手解释,具体代码如下
#include <stdio.h>
#include <memory.h>

int f(int i)
{
  char c[1024 * 1024 * 11];
  memset(c, 0, sizeof(c));
  return (0);
}

int main()
{
  f(1);
  return (0);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

挽清梦 2022-10-22 09:21:33

你设置的ulimit 值只在当前tty 有效,哪怕20M也有可能

你可以把这个值在 .bash_profile 里设置就全局了。

浮生未歇 2022-10-22 09:21:33

你设置的ulimit 值只在当前tty 有效,哪怕20M也有可能

你可以把这个值在 .bash_profile 里设置就全局了。 ...
crazyhadoop 发表于 2011-04-17 17:13

目前修改的结果
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATHHOME/bin
ulimit -s 20480
export PATH
unset USERNAME

程序运行的结果
21M
段错误

为何老是分配多1M呢?
代码如下
int f(int i)
{
  char c[1024 * 1024];
  printf("%dM\n", i + 1);
  f(i + 1);
  return (0);
}

int main()
{
  f(0);
  return (0);
}

浪漫人生路 2022-10-22 09:21:33

这个计数是按1000 还是1024? 是这样的影响吗?

慵挽 2022-10-22 09:21:33

不是吧。
ulimit -s 20480 就是把堆栈大小设置为20M,就是2 * 1024 * 1024字节
我每次分配1024 * 1024字节,也就是1M。
正确的结果应该是20M或者是19M。
现在疑问就是,居然分配的栈空间大于了20M。

寻找我们的幸福 2022-10-22 09:21:33

你把变量申请这个放到一个线程中去测试,不要放在进程里。你现在测试的是进程栈,对吧?

线程栈是进程栈的一个子集才对。

陈年往事 2022-10-22 09:21:33

放到线程中的话,确实是10M不到,但是为何在进程中是会超过10M的呢?

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. int f(int i)
  4. {
  5.   char c[1024 * 1024];
  6.   printf("%dM\n", i + 1);
  7.   f(i + 1);
  8.   return (0);
  9. }
  10. void *thread(void *argv)
  11. {
  12.   f(0);
  13.   return ((void *)0);
  14. }
  15. int main()
  16. {
  17.   pthread_t pt;
  18.   int pid = pthread_create(&pt, NULL, thread, NULL);
  19.   sleep(5);
  20.   return (0);
  21. }

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文