关于LINUX下进程栈的问题
我设置的堆栈大小是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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
你设置的ulimit 值只在当前tty 有效,哪怕20M也有可能
你可以把这个值在 .bash_profile 里设置就全局了。
目前修改的结果
# .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);
}
这个计数是按1000 还是1024? 是这样的影响吗?
不是吧。
ulimit -s 20480 就是把堆栈大小设置为20M,就是2 * 1024 * 1024字节
我每次分配1024 * 1024字节,也就是1M。
正确的结果应该是20M或者是19M。
现在疑问就是,居然分配的栈空间大于了20M。
你把变量申请这个放到一个线程中去测试,不要放在进程里。你现在测试的是进程栈,对吧?
线程栈是进程栈的一个子集才对。
放到线程中的话,确实是10M不到,但是为何在进程中是会超过10M的呢?
复制代码