11.01-03 系统限制
可以从哪些地方获取系统限制信息?
- limits.h 头文件中定义的限制。
sysconf
获取的限制,这些限制在进程运行期间保持恒定。获取限制一般使用_SC
开头的宏作为参数。pathconf
和fpathconf
获取的限制,这些限制在进程运行期间是可以改变的。获取限制一般使用_PC
开头的宏作为参数。
pid_t
类型的表示上限
在我的 wsl 中来看,pid_t
这个数据类型占用 4 个字节,是一个有符号整数(实际上是 int
),我这里 /proc/sys/kernel/pid_max 显示可用的最大 pid 号为 4194304,即 $2^{22}$。这其实和 PID_MAX_LIMIT
相等,不可能将 pid_max 调整得更大,但是可以小于这个值。在 32 位机器上,这个系统限制最大是 32768,即 $2^{15}$。最大可用的 pid 值比文件中的值小 1,见后文。
参考 https://unix.stackexchange.com/a/162105/ 。
$ sudo sysctl -w kernel.pid_max=4194303 # 改小可以
kernel.pid_max = 4194303
$ sudo sysctl -w kernel.pid_max=4194305 # 改大不行
sysctl: setting key "kernel.pid_max": Invalid argument
$ sudo sysctl -w kernel.pid_max=4194304 # 改回默认值
kernel.pid_max = 4194304
直接向 /proc/sys/kernel/pid_max 里面 echo
也是可以的,只是 sudo
给命令的提权并不会作用于当前 shell 的重定向符号(重定向使用的权限是当前的 shell 的)。这种情况下可以用 ... | sudo tee
,也可以用 sudo bash -c '...'
把 echo
和重定向包在内部。
🆕2025.2.9 最大可用的 pid 值比文件 /proc/sys/kernel/pid_max
中的小 1。可见 此处。man 5 proc
中有提到:
/proc/sys/kernel/pid_max
This file (new in Linux 2.5) specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). The default value for this file, 32768, results in the same range of PIDs as on earlier kernels. On 32-bit platforms, 32768 is the maximum value for
pid_max
. On 64-bit systems,pid_max
can be set to any value up to $2^{22}$ (PID_MAX_LIMIT, approximately 4 million).