pid_t 是否有任何合理的 initial/invalid 值?

Is there any reasonable initial/invalid value for a pid_t?

-Wextra 标志打开到 gcc 似乎具有禁止 struct 部分初始化的效果。例如:

// main.c
#include <pthread.h>

typedef struct S {
  int i;
  pid_t pid;
} S;

int main( int argc, char* argv[] ) {
  (void)argc;
  (void)argv;
  S s = { 42 };
  (void)s;

  return 0;
}
$ gcc --version && gcc -Wall -Wextra -pedantic -Werror ./main.c
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

./main.c: In function ‘main’:
./main.c:12:3: error: missing initializer for field ‘pid’ of ‘S {aka struct S}’ [-Werror=missing-field-initializers]
   S s = { 42 };
   ^
./main.c:6:9: note: ‘pid’ declared here
   pid_t pid;
         ^~~
cc1: all warnings being treated as errors

pid_t是否有任何合理的初始(无效)值?我一直觉得由于pid_t是不透明的,所以不应该对标志值做出任何假设。

如果 pid_t 没有合理的 initial/invalid 值 是否有其他一些 good/widely-used 编程实践不会遇到此错误?


注意:特别有兴趣了解是否存在不涉及分配任意值的选项,该值在单独的有效性标志变量设置为真之前被假定为无效,例如

typedef struct S {
  int i;
  pid_t pid;
  bool valid;
} S;

S s = { 42, 9, false };

pid_t 不是不透明的。零和所有负值都是明确的异常值(例如 waitpid 用来表示要等待的特定 类 进程)并且可以说 1 也是异常值,因为 -1 的特殊性阻止 1 成为进程组id你可以正常使用(传统上pid 1是init进程)

就您的目的而言,0 似乎是最合理的选择。

pid_t 并非完全不透明,它由 POSIX (2.12.1) to be a signed integer type, and valid process IDs are always positive integers (3.300) 定义。

我会使用 0-1 作为默认值,因为它们都不是有效的进程 ID。 fork(),例如,returns 0 表示当前进程是父进程,-1 表示错误。