首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序,奇怪的行为

C程序,奇怪的行为
EN

Stack Overflow用户
提问于 2013-05-29 01:29:47
回答 2查看 170关注 0票数 0

最近,我在使用一个C应用程序时遇到了“Oops,Spwan error,can‘t allocate’的问题。

为了更好地理解文件描述符和内存管理,我尝试了这个示例程序,它给了我令人震惊的结果。

下面是代码。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int ac, char *av[]);

int main(int ac, char *av[])
{
int fd = 0;
unsigned long counter=0;
while (1)
{
char *aa = malloc(16384);
usleep(5);
fprintf(stderr,"Counter is %ld \n", counter);
fd = fopen("/dev/null",r")
}

return 0;
}

在示例程序中,我尝试每5微秒分配一次内存,同时打开一个文件描述符。

现在,当我运行程序时,它开始增加内存,文件描述符也开始增加,但内存增加到82.5%,文件描述符增加到1024。我知道'ulimit‘设置了这个参数,默认是1024。

但是这个程序一定会因为占用内存而崩溃,否则它会给出错误‘Can't spawn child',但它是工作的。

所以我只想知道为什么它没有崩溃,为什么它没有给出子错误,因为它达到了文件描述符限制。

EN

回答 2

Stack Overflow用户

发布于 2013-05-29 01:31:53

它不会崩溃,可能是因为当malloc()发现没有更多的内存可分配和返回时,它只是返回NULL。同样,open()也只返回一个负值。换句话说,你的操作系统和标准库的合作比让你的程序崩溃要聪明得多。

票数 2
EN

Stack Overflow用户

发布于 2013-05-29 01:34:21

这样做有什么意义呢?

此外,在linux上,如果"aa“上没有实际写入任何内容,系统甚至不会耗尽内存。

无论如何,如果你真的可以占用所有的内存(这永远不会发生,对于Linux和*bsd,不知道windows),它只会导致系统像地狱一样滞后甚至死机,而不仅仅是你的应用程序崩溃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16798051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档