Linux中的最大PID是多少?

80

我正在将一个从Tru64迁移的应用程序移植到Linux,它使用limits.h中定义的PID_MAX。 Linux没有这个定义。 在不手动读取/proc/sys/kernel/pid_max的情况下,如何在c中找到PID_MAX? 是否有一个库可以使用?


据我所知,Linux中的PID_MAX是UINT_MAX,这取决于CPU。 - Geoffrey
在Linux中,UINT_MAX不取决于CPU,它始终为0x7fffffff。 - R.. GitHub STOP HELPING ICE
额,我是指 INT_MAXpid_t 当然是有符号整数,而不是无符号的,但我在脑海中复制了 gnif 的写法。 :-) - R.. GitHub STOP HELPING ICE
PID_MAX_LIMITthreads.h 中被定义。请参见 https://elixir.bootlin.com/linux/latest/source/include/linux/threads.h#L33。 - Sony Santos
4个回答

120

1
好的,那不是我想做的,但最终我读取了文件中的值。我想这已经没有其他办法了。 - Alexander Stolz
3
很遗憾,你回答中提供的Condor链接已经失效了。我已经用archive.org的链接替换了它,当然如果你知道当前版本的文档会更好。 - derobert
那个 pid_max 文件中显示的限制是包含在内的吗?getpid() 函数能否返回那个数字本身,或者最大值是那个数字减一?(也就是说,默认情况下,一个进程的 PID 是否可以是 32768,还是最大值为 32767?) - Alexis Wilke
2
很好,对于 Ubuntu 20.04 来说,/proc/sys/kernel/pid_max 现在被设置为 4194304... - Avio

21

Linux中PID的最大值是可配置的。您可以通过/proc/sys/kernel/pid_max文件访问它。这个文件(在Linux 2.5中新增)指定了PID环绕的值(即,该文件中的值比最大PID大1)。该文件的默认值为32768,导致与早期内核上相同范围的PID。该文件中的值可以设置为任何值,最高可达2^22(PID_MAX_LIMIT,约为400万)。

从编程角度来看,您必须使用pid_t类型来处理进程ID。您甚至可以使用整数特性访问其最小/最大值。以下是在x86_64平台上运行Linux 2.6.X上使用C++和Boost进行操作的示例:

$ cat test.cpp 
#include <sys/types.h>
#include <iostream>
#include <boost/integer_traits.hpp>

using namespace std;

int main ()
{
    cout << "pid_t max = " << boost::integer_traits<pid_t>::const_max << endl;
}

$ ./test 
pid_t max = 2147483647

9
问题标记为C,而不是C++。你回答的后半部分不适用于C,并且在C中是不可能的。 - R.. GitHub STOP HELPING ICE
4
@R:这只是一个例子,如果我知道如何在C中获取pid_t的编译时特征,我会写C。我相信有一些宏定义可以实现同样的功能。 - user405725
@yuyichao,更准确的说法是 pow(8, sizeof(pid_t)) - bfontaine
1
@bfontaine,更准确的写法应该是 pow(2, 8 * sizeof(pid_t))。(这并不是完美的解决方案,但我想澄清将8乘以字节数所产生的明显错误,这与所需值几乎没有关系) - MickLH
1
@craig65535 getpid保证不会返回错误。 - Mason
显示剩余3条评论

14

来自proc(5)手册页:

/proc/sys/kernel/pid_max (自Linux 2.5.34起)

这个文件指定了PID环绕的值(即,这个文件中的值比最大PID值大1)。大于此值的PID将不会被分配;因此,这个文件中的值也作为系统范围内进程和线程总数的限制。该文件的默认值32768导致与早期内核上相同范围的PID。在32位平台上,32768是pid_max的最大值。在64位系统上,pid_max可以设置为任何值,最高可达2^22 (PID_MAX_LIMIT, 大约400万)。


2
我很高兴你包含了参考。 - Sony Santos

4
似乎Ubuntu 20.04已经将限制推到了最大值(4194304):
% cat /proc/sys/kernel/pid_max
4194304

对我来说,它是32768(Ubuntu 20.04 WSL2)。 - Maasoud Asadi
1
@MaasoudAsadi 很有趣,我猜可能是因为WSL2可能有另一个内核... - Antti Haapala -- Слава Україні
1
Ubuntu 20.10 和 4194304。 - Zach Bloomquist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接