C程序,奇怪的行为

时间:2013-05-28 17:29:47

标签: c file-descriptor

最近,我遇到了使用一个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>

但是这个程序必须通过吃内存来崩溃,否则它应该会出错'无法生成孩子',但它正在运行。

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

2 个答案:

答案 0 :(得分:2)

它没有崩溃,可能是因为当malloc()找不到分配和返回的内存时,它只返回NULL。同样,open()也只返回负值。换句话说,您的操作系统和标准库的协作比使程序崩溃更加智能。

答案 1 :(得分:0)

这样做有什么意义?

另外在linux上,如果没有实际写入“aa”,系统甚至不会占用内存。

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