我一直在使用AIX,看到一些进程ID运行的时间长了8个......
我正在使用PID作为与另一个char *值的串联,如果你从“char视角”看它,我试图找出PID的可能长度是什么?
我查看了pid_t结构(例如t.html“> http://dvbstreamer.sourceforge.net/api/structPID_t.html),它将PID作为INT ......
在那个注释中我假设一个PID是一个“signed int”....在这种情况下什么是signed int的最大长度?
感谢您的帮助
林顿
答案 0 :(得分:4)
字节大小取决于系统,应该像这样查询:
unsigned int pidLength = sizeof(pid_t);
编辑:如果您担心printf("%d", myPID);
中的十进制表示的长度,我建议也查询一下。例如,snprintf
函数返回如果有足够的空间,它将写入的字符数(没有空终止)。所以你可以这样做:
char tmpChar;
int representationLength = snprintf(&tmpChar, 1, "%d", myPID);
if (representationLength == -1) { handle_error(); }
char *finalString = malloc(representationLength + 1);
snprintf(finalString, representationLength + 1, "%d", myPID);
也许snprintf(NULL, 0, "%d", myPID)
也可以查询长度,但Linux snprintf
手册页说明了这一点:
关于snprintf()的返回值,SUSv2和C99相互矛盾:当使用size = 0调用snprintf()时,SUSv2规定一个小于1的未指定返回值,而C99允许str在这种情况下为NULL ,并且返回值(一如既往)为在输出字符串足够大的情况下写入的字符数。
答案 1 :(得分:1)
32位int中的最大位数为10.
64位signed int中的最大位数为19。
64位无符号整数中的最大位数为20.
我不知道AIX是否为其pid_t
使用32位或64位(有符号或无符号)。
编辑:它必须被签名,因为fork可以返回-1。
答案 2 :(得分:1)
另一种方法可能是使用(int)log10(pid)+ 1.当然,您可能需要为终止空字符包含空格,但上面应该为您提供表示值所需的字符数一个字符串。