2012-04-09 35 views
2

我有一堆EAGAIN试图fork()或产卵线程,这导致我相信我在某处泄漏资源。监控进程内部的unix资源

是否有可能,在POSIX,摆脱这个过程本身内部的以下内容:

  • 数目的活动并行线程的
  • 数目的活动子进程
  • 数目的活动管道
  • 数的活动插座(或者可能这个和管道将被计算为文件描述符?)

或者做这些hav e要手动计数?他们已经有柜台了,但我认为其中一个正在泄漏。

+0

您创建了多少个子/线程? – Duck 2012-04-09 14:54:00

+0

可能相当多,他们主要是在运行exec()之前调用fork(),但我想知道它们是否正确终止。 – kamziro 2012-04-10 13:59:17

回答

1

我猜你会得到EAGAIN,因为你正在达到资源限制。对于可以运行多少个线程/进程存在系统限制。你可以用

cat /proc/sys/kernel/threads-max 

查看,并与

echo 100000 > /proc/sys/kernel/threads-max 

分别更改。更有可能你正在对流程进行用户限制。您应该阅读手册页并在getrlimitulimit上进行搜索。 SO上有很多这方面的信息。

假设你从一个父母产卵了所有这些过程,应该很容易跟踪它们。您在fork()之前增加父母中的计数器。如果孩子产卵,那么它变得更加复杂,你需要使用共享内存或其他IPC机制。在任何情况下,您都可以使用wait()waitpid()系统调用来确定您的孩子的状态,并基于此计算您的过程计数器。由wait返回的状态数据将告诉您每个孩子的终止处置。同样,如果遇到麻烦,SO上的相关问题也会有相当多的细节。

在回答你的主要问题时,有一些方法可以查询系统(通常通过/ proc)你所关心的一些资源。如果您关注您自己的资源,这几乎总是错误的方式。完全有能力自己追踪它们,并且效率更高。

祝你好运。希望这可以让你指出正确的方向。