如何可移植地确定pid_t
类型的最大值?我的系统上没有PID_MAX常量。
(注意,我的意思是数据类型允许的最大值,而不是系统将分配给进程的事实上的最大值。)
用例:我正在将用户提供的pid字符串规范转换为pid_t
,并希望确保用户的输入不超过类型的容量。
答案 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)
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
您也可以根据基于环境变量的服务器/操作系统相关定义来执行此操作。