如何正确初始化sigset_t

How to correctly initialize sigset_t

提问人:Sergio 提问时间:1/10/2020 更新时间:11/18/2023 访问量:2064

问:

众所周知,如果需要重置一个变量,就足够了sigset_t

    sigemptyset(&my_ss);

我想知道是否有一种标准方法可以初始化此类变量以将其设置为空(即就好像用户只是使用上面显示的方法重置了它一样)。也许是某种类似于 pthread API 的宏。例如

static sigset_t trackedSignals = SIGSET_INITIALIZER;

在 Linux 系统上,用作此类初始值设定项显然就足够了,但它可以在任何地方工作吗?因为正如我所看到的,POSIX在定义这种类型方面非常少:{0}

sigset_t

[CX] 用于表示信号集的对象的整数或结构类型。

因此,严格来说,不必将此对象初始化为语义上的“空”。{0}

C Linux UNIX 信号 POSIX

评论

4赞 zwol 1/10/2020
如果有一种标准方法可以做到这一点,它会出现在 pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html 的某个地方,我什么也没看到,所以我认为 ISO C 和 POSIX 中的答案是“做不到,你必须调用 sigemptyset”。我没有将其作为答案发布,因为我不知道在某些特定操作系统上是否有一种非标准但受支持的方法。[但是,我可以告诉你,GNU libc 并不正式支持 Sorry。sigset_t ss = { 0 };
0赞 rhaport 1/10/2020
我认为问题在于sigset_t它没有确切地指定它是如何定义的。正如规范中所述,它是整数或结构类型对象,没有细节。由于确切的定义对用户是隐藏的,因此我们不能依赖结构或空的含义。换句话说,结构可能(理论上)太复杂,无法浅层复制常量。此外,也许对于该隐藏结构的某些字段0xFF或其他东西意味着“空”。
0赞 R.. GitHub STOP HELPING ICE 1/10/2020
@rhaport:不能“太复杂,不能浅层复制”。它是一种值类型,而不是引用;没有什么禁止按价值传递它。但是,不能保证实际代表。它可以对位进行任意排序、反转、校验和、用格雷码编码等。
0赞 rhaport 1/10/2020
@R..GitHubSTOPHELPINGICE 对。这就是意思。没有保证。
3赞 R.. GitHub STOP HELPING ICE 1/10/2020
@rhaport:不过,这些事情都不排除空集有“”;缺少一个只是规范的烦人选择,而不是避免限制实现的根本需要的东西。SIGSET_INITIALIZER

答:

-2赞 user16217248 11/18/2023 #1

根据 GNU 文档,最可移植的方法是根本不初始化内联:sigset_t

为了便于移植,请仅使用本节中描述的函数来初始化、更改和检索对象中的信息,不要尝试直接操作它们。sigset_t

公认的和最可移植的做法是使用 初始化类型。例如,如果有,则应调用程序的入口点。sigemptyset()static sigset_t trackedSignals;sigemptyset(&trackedSignals);