I am porting an application from Tru64 to Linux and it uses PID_MAX defined in limits.h. Linux doesn't have that define. How do I find PID_MAX in c without reading /proc/sys/kernel/pid_max by hand? Is there a library?
4 Answers
It's 32768 by default, you can read the value on your system in /proc/sys/kernel/pid_max.
And you can set the value higher on 64-bit systems (up to 222 = 4,194,304) with:
echo 4194304 > /proc/sys/kernel/pid_max Read more here:
http://www.cs.wisc.edu/condor/condorg/linux_scalability.html (via archive.org)
4 Comments
pid_max file inclusive? Can getpid() return that very number or is the maximum that number minus one? (i.e. by default, can a process have PID 32768 or is the maximum 32767?)Ubuntu 20.04 it looks like /proc/sys/kernel/pid_max is now set to 4194304...The maximum value of the PID in Linux is configurable. You can access it trough /proc/sys/kernel/pid_max file. 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. The value in this file can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).
From the programming perspective, you have to use pid_t type to work with process ID. You can even access its min/max values using integer traits. Here is an example of doing that using C++ and Boost on Linux 2.6.X running on x86_64 platform:
$ 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 8 Comments
pow(8, sizeof(pid_t)).pow(2, 8 * sizeof(pid_t)). (not a perfect solution, but I wanted to clear up the glaring error with raising 8 to the number bytes, which is barely even related to the desired value)From the proc(5) man page:
/proc/sys/kernel/pid_max(since Linux 2.5.34)This file specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). PIDs greater than this value are not allocated; thus, the value in this file also acts as a system-wide limit on the total number of processes and threads. 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_maxcan be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).
1 Comment
It seems that Ubuntu 20.04 has pushed the limit to the maximum (4194304):
% cat /proc/sys/kernel/pid_max 4194304
UINT_MAXdoes not depend on the CPU in Linux. It's always 0x7fffffff.INT_MAX.pid_tis of course a signed int, not unsigned, but I mentally copied what gnif wrote. :-)PID_MAX_LIMITis defined inthreads.h. See elixir.bootlin.com/linux/latest/source/include/linux/….FILE *fp = fopen ("/proc/sys/kernel/pid_max", "r");(validation omitted) and thenif (fscanf (fp, "%u", &pid_max) == 1) { printf ("pid_max: %u\n", pid_max); }and finallyfclose (fp);(no write, so no validate-on-close necessary)