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