6

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

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

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

4

4 回答 4

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 ... */
}

使用较大的数据类型没有很好的选择。“long”曾经是最大的原始整数数据类型,但在某些常见的编译器/体系结构上不再适用——即使对于 Linux 也是如此(参见下面的评论)。同时,intmax_t 类型的库支持很差。结果是 int64_t 在实践中有时更有用。

但是,基本上您对较大数据类型的选择可能是 long、int64_t 和 intmax_t。

于 2012-10-11T14:22:17.563 回答
2

POSIX (2008) 说

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.

于 2012-10-11T14:32:46.880 回答
1

史蒂文的回答是一个很好的方法。

但是,如果您真的想在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()并完成它。)

于 2012-10-11T16:38:47.157 回答
0

在您的一个标题中:

#ifndef PID_MAX
#define PID_MAX INT_MAX // or whatever value you see fit
#endif

您也可以根据基于环境变量的服务器/操作系统相关定义来执行此操作。

看: 类似的帖子:Linux中的最大PID

于 2012-10-11T14:16:52.430 回答