代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

信号屏蔽和信号集有什么关系和区别?

  •  -1
  • Tim unnamed eng  · 技术社区  · 7 年前

    来自APUE

    每个过程都有一个 信号屏蔽 它屏蔽了当前被屏蔽的信号集 交付到该流程。我们可以把这个面具想象成每种可能都有一个位 信号。如果给定信号的位为开,则该信号当前被阻塞。一个过程可以 通过调用sigprocmask检查并更改其当前信号掩码 ,我们 在第10.12节中描述。

    因为信号的数量有可能超过 integer,posix.1定义了一个名为sigset的数据类型,它包含一个 信号装置 . 这个 例如,信号掩码存储在这些信号集中的一个中。我们描述 ve 操作信号装置的功能 在第10.11节中。

    信号屏蔽和信号集有什么关系和区别?

    一个信号杆是一个基准,一个信号集是一个对象吗,因为一个基准存储在一个对象中?

    有什么区别,我们什么时候使用:

    #include <signal.h>
    int sigaddset(sigset_t *set, int signo);
    int sigdelset(sigset_t *set, int signo);
    

    #include <signal.h>
    int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
    

    谢谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

    信号掩码是进程的一个属性,即被阻塞的信号列表。 sigprocmask 检索和/或更新进程的此属性。

    信号集是一种数据类型,它包含一系列信号号。 sigaddset sigdelset 用于修改包含此数据的对象。

    当您想要设置或检索进程的信号掩码时, sigprocmask() 系统调用接受类型为 sigset_t* 保存指向此列表的指针。

    它类似于进程id和 pid_t .

    因此,如果要修改进程的信号掩码,可以执行以下操作:

    1. 呼叫 sigprocmask() 空值 set 非空 oset 获取当前进程掩码的参数 sigset_t 变量。
    2. 呼叫 sigaddset() 和/或 sigdelset() 从变量中添加和删除信号。
    3. 呼叫 sigprocmask() 具有 how = SIG_SETMASK 设置 包含更新的信号集。

    如果只想添加或删除掩码中的信号,而不是同时添加或删除这两个信号,则可以使用 SIG_BLOCK SIG_UNBLOCK 在一次调用中执行的操作 硅掩模 . 只需创建一个包含要添加或删除的信号的信号集,它们将与现有掩码合并。