如何确定pid_t的最大值?

时间:2012-10-11 14:07:30

标签: c linux size pid

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

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

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

4 个答案:

答案 0 :(得分: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在实践中有时更有用。

但是,基本上你对更大数据类型的选择可能很长,int64_t和intmax_t。

答案 1 :(得分:2)

POSIX (2008) says

  

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

  

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

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

答案 2 :(得分: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()并完成它。)

答案 3 :(得分:0)

在您的一个标题中:

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

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

查找: Similar post : Maximum PID in Linux