0

最近我在使用一个 C 应用程序时遇到了“糟糕,Spwan 错误,无法分配内存”的问题。

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

这是代码。

#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。

但是这个程序必须通过吃掉内存而崩溃,否则它应该给出错误'不能产生孩子',但它正在工作。

所以只是想知道为什么它没有崩溃以及为什么它在达到文件描述符限制时没有给出子错误。

4

2 回答 2

2

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

于 2013-05-28T17:31:52.500 回答
0

这样做有什么意义?

另外在linux上,如果“aa”上没有写任何东西,系统甚至不会吃掉内存。

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

于 2013-05-28T17:34:20.923 回答