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
表示错误。
将 -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
表示错误。