最近我遇到了在使用一个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。
但是这个程序必须崩溃吃内存或它应该给出错误' Can't spawn child',但它是工作的。
所以只是想知道为什么它没有崩溃,为什么它没有给子错误,因为它达到了文件描述符限制
它不会崩溃,可能是因为当malloc()
发现没有更多的内存分配和返回时,它只是返回NULL
。同样,open()
也只返回一个负值。换句话说,你的操作系统和标准库的合作是比使你的程序崩溃更智能的。
这样做有什么意义?
另外,在linux上,如果没有在"aa"上写任何东西,系统甚至不会占用内存。
无论如何,如果你真的可以占用所有的内存(这是永远不会发生的,对于Linux和*bsd,不知道windows),它只会导致系统像地狱一样延迟甚至冻结,而不仅仅是崩溃你的应用程序