【问题标题】:Is sa_mask default value empty?sa_mask 默认值为空吗?
【发布时间】:2021-03-24 08:48:46
【问题描述】:

我正在尝试实现一个信号处理程序,并且想知道是否需要显式清空 struct sigactionsa_mask 字段,或者是否使用默认值初始化它足够了。

【问题讨论】:

  • 您是从 posix sigaction 裁判到 sa_mask 字段吗?您需要为您的问题添加一点上下文。
  • 是的,我正在尝试初始化 struct sigaction 并设置 sa_flags 和 sa_sigaction 但我不知道是否需要清空 sa_mask
  • 您需要确保将其设置为已知状态——所有位为零都可以。如果该结构是在堆栈上分配的,则必须将其显式归零。如果它是由malloc() 分配的,则同上,但如果它是由calloc() 分配的,则不是。如果结构是在文件范围(静态或全局)分配的,它将被初始化为所有字节,默认为零。所有这些都假设您不提供初始化程序。这会将您未明确初始化的位也设置为零。

标签: c linux signal-handling sigaction


【解决方案1】:

实际上,您可以使用 memset() 之类的方法将结构初始化为 0,然后初始化信号处理程序字段:

struct sigaction action;

memset(&action, 0, sizeof(struct sigaction));
action.sa_handler = handler_func;

理论上,像“sigset_t”这样的类型化对象具有其正确的初始化方法。因此,您不能认为通过 memset() 将其设置为 0 会起作用。因此,对于这个字段,你应该使用signal set相关的例程来操作它:

struct sigaction action;

memset(&action, 0, sizeof(struct sigaction));
sigemptyset(&(action.sa_mask));
action.sa_handler = handler_func;

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2013-08-05
    • 1970-01-01
    • 2011-01-24
    • 2016-12-11
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多