84

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?

5
  • AFAIK, PID_MAX in Linux is UINT_MAX, which depends on the cpu Commented Jun 9, 2011 at 14:11
  • UINT_MAX does not depend on the CPU in Linux. It's always 0x7fffffff. Commented Jun 9, 2011 at 14:23
  • Erm, I meant INT_MAX. pid_t is of course a signed int, not unsigned, but I mentally copied what gnif wrote. :-) Commented Jun 9, 2011 at 14:29
  • PID_MAX_LIMIT is defined in threads.h. See elixir.bootlin.com/linux/latest/source/include/linux/…. Commented Jan 10, 2019 at 6:46
  • Just read it by hand, what could be easier? FILE *fp = fopen ("/proc/sys/kernel/pid_max", "r"); (validation omitted) and then if (fscanf (fp, "%u", &pid_max) == 1) { printf ("pid_max: %u\n", pid_max); } and finally fclose (fp); (no write, so no validate-on-close necessary) Commented Aug 12, 2024 at 8:35

4 Answers 4

120

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)

Sign up to request clarification or add additional context in comments.

4 Comments

Ok that was not what I wanted to do but I ended up reading the value from the file. I guess there is no other way.
The Condor link in your answer went 404, unfortunately. I've replaced it with a link through archive.org, of course it'd be better if you know of a current version of the document.
Is the limit shown in that 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?)
Nice, for Ubuntu 20.04 it looks like /proc/sys/kernel/pid_max is now set to 4194304...
20

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

Question is tagged C, not C++. The second half of your answer does not apply to C and is not possible in C.
@R: This is just an example, if I knew how to get compile-time traits for pid_t in C, I'd write C. I am sure there is some equivalent with macros.
@yuyichao it would be more like pow(8, sizeof(pid_t)).
@bfontaine it would be more like 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)
@craig65535 getpid is guaranteed not to return an error
|
14

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_max can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).

1 Comment

I'm glad that you included reference.
6

It seems that Ubuntu 20.04 has pushed the limit to the maximum (4194304):

% cat /proc/sys/kernel/pid_max 4194304 

4 Comments

for me it's 32768 (Ubuntu 20.04 WSL2)
@MaasoudAsadi interesting, I guess it might be because WSL2 might have another kernel...
Ubuntu 20.10 and 4194304 here.
Same for Ubuntu 22.04. I was curious since top reports PIDs well beyond 32768

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.