如何可移植地确定类型的最大值pid_t
?我的系统上没有 PID_MAX 常量。
(注意,我指的是数据类型允许的最大值,而不是系统将分配给进程的事实上的最大值。)
用例:我正在将用户提供的 pid 字符串规范转换为 a pid_t
,并希望确保用户的输入不超过类型的容量。
我过去有时会使用较大的数据类型,然后当我转换为较小的类型时,立即转换回较大的类型并检查值是否没有改变。
例如,假设您使用 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 ... */
}
使用较大的数据类型没有很好的选择。“long”曾经是最大的原始整数数据类型,但在某些常见的编译器/体系结构上不再适用——即使对于 Linux 也是如此(参见下面的评论)。同时,intmax_t 类型的库支持很差。结果是 int64_t 在实践中有时更有用。
但是,基本上您对较大数据类型的选择可能是 long、int64_t 和 intmax_t。
blksize_t、pid_t 和 ssize_t 应为有符号整数类型。
和:
实现应支持一种或多种编程环境,其中 blksize_t、pid_t、size_t、ssize_t 和 suseconds_t 的宽度不大于 long 类型的宽度。
因此,您可以将用户字符串转换long
为 pid_t 类型,然后使用long pid; .. pid == (pid_t)pid
.
史蒂文的回答是一个很好的方法。
但是,如果您真的想在pid_t
不依赖未定义行为的情况下确定最大值,我认为您最好的选择是:
#include <sys/types.h>
#include <limits.h>
#include <stdlib.h>
static inline pid_t get_max_pid_t()
{
if (sizeof(pid_t) == sizeof(short)) return SHRT_MAX;
if (sizeof(pid_t) == sizeof(int)) return INT_MAX;
if (sizeof(pid_t) == sizeof(long)) return LONG_MAX;
#if defined(LLONG_MAX) // C99
if (sizeof(pid_t) == sizeof(long long)) return LLONG_MAX;
#endif
abort();
}
POSIX 保证这pid_t
是一个有符号整数类型。此代码假定有符号整数类型的大小唯一确定该类型。我认为这是一个很好的假设,但我不确定标准是否保证了这一点。
任何体面的编译器都会将所有这些内联并不断传播到不存在的状态,因此性能不是问题。
(旁白:在 C++ 中,您将编写std::numeric_limits<pid_t>::max()
并完成它。)
在您的一个标题中:
#ifndef PID_MAX
#define PID_MAX INT_MAX // or whatever value you see fit
#endif
您也可以根据基于环境变量的服务器/操作系统相关定义来执行此操作。