2

我有一堆 EAGAIN 试图 fork() 或产生线程,这让我相信我在某处泄漏资源。

在 POSIX 中,是否有可能从进程本身内部获取以下内容:

  • 活动 pthread 数
  • 活动子进程数
  • 活动管道数
  • 活动套接字的数量(或者这个和管道可能会被视为文件描述符?)

还是必须手动计算这些?他们已经有柜台了,但我认为其中一个正在泄漏。

4

1 回答 1

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)以获取您关心的一些资源。如果您担心自己的资源,这几乎总是错误的方式。您可以自己跟踪它们,而且效率要高得多。

祝你好运。希望这会为您指明正确的方向。

于 2012-04-10T17:26:17.320 回答