11.01-03 系统限制

可以从哪些地方获取系统限制信息?

  1. limits.h 头文件中定义的限制。
  2. sysconf 获取的限制,这些限制在进程运行期间保持恒定。获取限制一般使用 _SC 开头的宏作为参数。
  3. pathconffpathconf 获取的限制,这些限制在进程运行期间是可以改变的。获取限制一般使用 _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).