最近,我遇到了使用一个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。 / p>
但是这个程序必须通过吃内存来崩溃,否则它应该会出错'无法生成孩子',但它正在运行。
所以只是想知道为什么它没有崩溃以及为什么它没有给出子错误,因为它达到了文件描述符限制。
答案 0 :(得分:2)
它没有崩溃,可能是因为当malloc()
找不到分配和返回的内存时,它只返回NULL
。同样,open()
也只返回负值。换句话说,您的操作系统和标准库的协作比使程序崩溃更加智能。
答案 1 :(得分:0)
这样做有什么意义?
另外在linux上,如果没有实际写入“aa”,系统甚至不会占用内存。
无论如何,如果你真的可以占用所有内存(对于Linux和* bsd永远不会发生,不了解windows),它只会导致系统滞后地狱甚至冻结,而不是只是崩溃了你的应用程序。