我正在将一个从Tru64迁移的应用程序移植到Linux,它使用limits.h中定义的PID_MAX。
Linux没有这个定义。
在不手动读取/proc/sys/kernel/pid_max
的情况下,如何在c中找到PID_MAX?
是否有一个库可以使用?
默认值为32768,您可以在系统中读取该值/proc/sys/kernel/pid_max
。
而在64位系统上,您可以使用以下命令将此值设置得更高(最高可达222=4,194,304):
echo 4194304 > /proc/sys/kernel/pid_max
详见:
http://www.cs.wisc.edu/condor/condorg/linux_scalability.html (via archive.org)
pid_max
文件中显示的限制是包含在内的吗?getpid()
函数能否返回那个数字本身,或者最大值是那个数字减一?(也就是说,默认情况下,一个进程的 PID 是否可以是 32768,还是最大值为 32767?) - Alexis WilkeUbuntu 20.04
来说,/proc/sys/kernel/pid_max
现在被设置为 4194304
... - AvioLinux中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
pow(8, sizeof(pid_t))
。 - bfontainepow(2, 8 * sizeof(pid_t))
。(这并不是完美的解决方案,但我想澄清将8乘以字节数所产生的明显错误,这与所需值几乎没有关系) - MickLH来自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万)。
% cat /proc/sys/kernel/pid_max
4194304
INT_MAX
。pid_t
当然是有符号整数,而不是无符号的,但我在脑海中复制了 gnif 的写法。 :-) - R.. GitHub STOP HELPING ICEPID_MAX_LIMIT
在threads.h
中被定义。请参见 https://elixir.bootlin.com/linux/latest/source/include/linux/threads.h#L33。 - Sony Santos