fork失败:无法分配内存

时间:2013-08-22 07:40:02

标签: c linux system fork out-of-memory

我有一个在linux机器上运行的程序。它会强制进程发送邮件,并经常记录fork失败消息,指出它无法分配内存。

当我检查驻留内存的大小时,它会出现在12Gb左右(此机器上的交换配置为仅1Gb)。

有没有办法可以确定这一大块内存不是泄漏而只是内存增长?

此外,是否存在可以调整的系统限制,以便我不会出现任何fork故障?

2 个答案:

答案 0 :(得分:3)

要检查内存泄漏,您可能希望在Valgrind下运行该程序:http://valgrind.org


要从控制台/ shell获取/设置限制,可以使用ulimit命令。

从程序内部,系统调用getrlimit() / setrlimit()提供此功能。


由于fork()导致内存可能紧张的情况的另一种解决方法是立即使用vfork(),然后调用exec*()函数系列的成员。

来自man vfork

  

vfork() clone(2)的特例。它用于创建新进程而无需复制父进程的页表。在创建子项的性能敏感应用程序中,它可能很有用,然后立即发出 execve(2)

     

vfork() fork(2)的不同之处在于,父级会暂停,直到子级终止(通常,通过调用 _exit(2)< / strong>,或在传递致命信号后异常),或致电 execve(2)。直到那个          point,子进程与其父进程共享所有内存,包括堆栈。孩子不能从当前功能返回或致电退出(3),但可以致电 _exit(2)

答案 1 :(得分:1)

我刚刚在嵌入式系统上得到了这个。没有限制,并且有一个小df进程有足够的可用RAM,所以它让我很困惑。然后我记得fork()通过写时复制工作 - 所以子进程有可能在不久的将来需要与父进程一样多的RAM。如果您发现该机器应该有大量可用内存,请记住这一点 - 它是否至少具有与调用fork()的进程一样多的可用内存?