我尝试使用fork()或产生线程时遇到了很多EAGAIN,这让我相信我在某处泄漏了资源。
在POSIX中,是否有可能从流程本身内部获取以下内容:
或者这些必须手动计算吗?已有专柜,但我认为其中一个正在泄漏。
答案 0 :(得分:1)
我猜你正在获得EAGAIN,因为你正在达到资源限制。可以运行的线程/进程数量存在系统限制。您可以使用
查看它cat /proc/sys/kernel/threads-max
并使用
进行更改echo 100000 > /proc/sys/kernel/threads-max
分别。您更有可能在流程上达到用户限制。您应该阅读手册页并在getrlimit
和ulimit
上进行搜索。 SO上有很多关于这些的信息。
假设您从一个父级产生所有这些进程,应该很容易跟踪它们。您在fork()
之前在父级中递增计数器。如果孩子正在产生孩子,那么它会变得更加复杂,你需要使用共享内存或其他一些IPC机制。在任何情况下,您都可以使用wait()
和waitpid()
系统调用来确定子项的状态,并根据该调用减少您的进程计数器。 wait
返回的状态数据将告诉您每个孩子的终止处置。如果你遇到麻烦的话,还有很多关于SO的问题会详细说明。
在回答您的主要问题时,有一些方法可以查询系统(通常通过/ proc)查询您所关注的一些资源。如果您担心自己的资源,这几乎总是错误的方法。您自己能够自己跟踪它们并且效率更高。
祝你好运。希望这能指出你正确的方向。