如何确定pid_t的最大值?

pil*_*row 6 c linux size pid

我如何可移植地确定该pid_t类型的最大值?我的系统上没有PID_MAX常量.

(注意,我的意思是数据类型允许的最大值,而不是系统将分配给进程的事实上的最大值.)

使用案例:我正在将用户提供的pid字符串规范转换为a pid_t,并希望确保用户的输入不超过类型的容量.

Ste*_*ven 6

我有时在过去使用的是更大的数据类型,然后当我转换为更小的类型时,立即转换回更大的类型并检查值是否没有改变.

例如,假设你使用的是int64_t,那么你可能会有类似的东西:

int64_t my_pid64;

/* ... parse string value into my_pid64 ... */

pid_t my_pid = (pid_t) my_pid64;
if ((int64_t) my_pid != my_pid64) /* check that value was not out of range of pid_t */
{
   /* ... handle error ... */
}
Run Code Online (Sandbox Code Playgroud)

没有很好的选择可以使用更大的数据类型."long"曾经是最大的原始整数数据类型,但在某些常见的编译器/体系结构上却不是这样 - 即使对于Linux(参见下面的注释).同时,intmax_t类型的库支持较差.结果是int64_t有时在实践中更有用.

但是,基本上您对较大数据类型的选择可能很长,int64_t和intmax_t.


jfs*_*jfs 2

POSIX (2008) 说

blksize_t、pid_t 和 ssize_t 应为有符号整数类型。

和:

该实现应支持一种或多种编程环境,其中 blksize_t、pid_t、size_t、ssize_t 和 suseconds_t 的宽度不大于 long 类型的宽度。

因此,您可以将用户字符串转换为 pid_tlong类型,然后使用 来检查 pid_t 类型是否溢出long pid; .. pid == (pid_t)pid