为什么用memset()初始化sigint变量有助于防止Seg Fault?

助力车

背景:

struct sigaction用于为处理中断的小型C程序设置处理程序。完成第二个处理程序的实现后,当我收到“分段错误(内核已转储)”错误消息时,出现了问题。我完全以相同的方式设置了两个处理程序。在不初始化sigaction结构的情况下,第一个中断处理程序工作正常,但是,当我完成第二个处理程序的实现时,我收到了seg fault错误。

题:

为什么用memset()初始化sigaction结构有助于修复错误?

码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <string.h>

#define ALARMSECONDS    3
int numSigints = 5;

/* Handler function that prints out the current time on a SIGALRM interrupt. */
static void hdl(int signum)
{
    time_t currTime;
    time(&currTime);
    printf("\ncurrent time is %s", ctime(&currTime));
    alarm(ALARMSECONDS);//re-arm the alarm

}

/* Handler function that captures SIGINT interrupts 5 times before 
   actually exiting. Makes use of global variable to keep track of
   number of times the interrupt was sent.
 */
static void sigint_hdl(int signum)
{

    numSigints -= 1;    

    if(numSigints == 0)
    {
      printf("\nFinal Control-c caught. Exiting.\n");
      exit(1);
    } 
    else
    {
      printf("\nControl-c caught. %d more before program is ended.\n", 
        numSigints);
    }   
}

/* Periodically prints out the current time in Unix date format using 
   sigaction interrupt handling.   
*/
int main(int argc, char *argv[])
{

    //
    // vars
    //
    struct sigaction act;
    struct sigaction sigint_act;

    memset(&act, '\0', sizeof(act));//TODO Why does this fix SEGFAULT???

    //
    // intro
    //
    printf("Date will be printed every 3 seconds.\n");
    printf("Enter ^C 5 times to end the program.\n");

    //
    // set alarm to go off in 3 seconds
    //
    alarm(ALARMSECONDS);

    //
    // set handler of the sigaction to 'hdl' function defined above
    //
    act.sa_handler = hdl;
    sigint_act.sa_handler = sigint_hdl;

    //
    // activate sigaction
    //
    if(sigaction(SIGALRM, &act, NULL) < 0)
    {
      perror("sigaction -- SIGALRM");
      return 1;
    }

    if(sigaction(SIGINT, &sigint_act, NULL) < 0)
    {
      perror("sigaction -- SIGINT");
      return 1;
    }

    //
    // infinite loop
    //
    while(1) {
    }

    return 0;
}
山姆·瓦尔沙夫奇克

结构中有许多字段sigaction将它们全部设置为零会将其设置为默认值。

如果它们不是零,则将以系统调用文档中描述的任何方式解释它们。一个示例是两个字段sa_masksa_sigaction并且根据的值sa_masksa_sigaction将安装代码的处理程序而不是预期的信号处理程序。并且由于您没有初始化指针,所以它将具有一些垃圾值,并且将尝试不仅取消引用,而且通过垃圾指针调用函数。

因此,如果无法初始化结构,则会得到未定义的行为。有时它会起作用,有时它不会以神秘的方式发生,例如崩溃。

通过将整个结构清除为零,您可以确保将发生默认行为,该行为将由您对结构所做的任何非默认设置进行修改。

经验教训:始终清除并初始化传递给库函数的所有结构。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WSDL 中的 Fault 元素声明有什么用?

来自分类Dev

是否可以编写有助于复制初始化的显式构造函数?

来自分类Dev

asio :: async_write SEG FAULT

来自分类Dev

分配矩阵时出现Fortran Seg Fault

来自分类Dev

用Segmentation Fault填充结构的数组崩溃

来自分类Linux

Segmentation Fault中“代码”的含义是什么

来自分类Dev

C:为什么会出现这个 Segmentation Fault?

来自分类Dev

C、为什么会出现Segmentation fault(core dumped)

来自分类Dev

为什么会出现如此烦人的二叉搜索树(bst)seg.fault 错误?

来自分类Dev

为什么并行计算有助于使用非本地资源?

来自分类Dev

TSQL查询有助于结构化结果

来自分类Dev

线程化有助于提高Java的效率吗?

来自分类Dev

递增变量j时实现atoi-Segmentation Fault

来自分类Dev

初始化命令对我有什么用?

来自分类Dev

为什么这段代码通常可以工作,但有时会产生 Segmentation Fault?

来自分类Dev

对象初始化-为什么用“:”而不是“ =”初始化对象属性

来自分类Dev

为什么 Redux 减速器上的计时器有助于触发重新渲染

来自分类Dev

重新生成会话ID是否有助于防止固定和/或劫持?

来自分类Dev

S3中的对象锁定是否有助于防止对象被覆盖?

来自分类Dev

较小的参数值如何有助于防止过拟合?

来自分类Dev

ECC RAM 是否有助于防止缓冲区溢出攻击

来自分类Dev

为什么在Mono中出现Segmentation Fault错误而不是StackOverflow错误?

来自分类Dev

为什么会出现错误“Segmentation fault 11”以及如何在 C 中修复它?

来自分类Java

它是否有助于GC将Java中的局部变量设为空

来自分类Dev

关闭选项卡/窗口之前删除变量是否有助于释放内存?

来自分类Dev

两次定义相同的变量/有助于理解

来自分类Dev

PYMC3混合物模型:有助于理解多变量模型

来自分类Dev

函数声明和变量声明的顶部是否有助于提高性能?

来自分类Linux

如何从Linux驱动程序访问和调试FDT / DTS设备树(seg-fault)

Related 相关文章

  1. 1

    WSDL 中的 Fault 元素声明有什么用?

  2. 2

    是否可以编写有助于复制初始化的显式构造函数?

  3. 3

    asio :: async_write SEG FAULT

  4. 4

    分配矩阵时出现Fortran Seg Fault

  5. 5

    用Segmentation Fault填充结构的数组崩溃

  6. 6

    Segmentation Fault中“代码”的含义是什么

  7. 7

    C:为什么会出现这个 Segmentation Fault?

  8. 8

    C、为什么会出现Segmentation fault(core dumped)

  9. 9

    为什么会出现如此烦人的二叉搜索树(bst)seg.fault 错误?

  10. 10

    为什么并行计算有助于使用非本地资源?

  11. 11

    TSQL查询有助于结构化结果

  12. 12

    线程化有助于提高Java的效率吗?

  13. 13

    递增变量j时实现atoi-Segmentation Fault

  14. 14

    初始化命令对我有什么用?

  15. 15

    为什么这段代码通常可以工作,但有时会产生 Segmentation Fault?

  16. 16

    对象初始化-为什么用“:”而不是“ =”初始化对象属性

  17. 17

    为什么 Redux 减速器上的计时器有助于触发重新渲染

  18. 18

    重新生成会话ID是否有助于防止固定和/或劫持?

  19. 19

    S3中的对象锁定是否有助于防止对象被覆盖?

  20. 20

    较小的参数值如何有助于防止过拟合?

  21. 21

    ECC RAM 是否有助于防止缓冲区溢出攻击

  22. 22

    为什么在Mono中出现Segmentation Fault错误而不是StackOverflow错误?

  23. 23

    为什么会出现错误“Segmentation fault 11”以及如何在 C 中修复它?

  24. 24

    它是否有助于GC将Java中的局部变量设为空

  25. 25

    关闭选项卡/窗口之前删除变量是否有助于释放内存?

  26. 26

    两次定义相同的变量/有助于理解

  27. 27

    PYMC3混合物模型:有助于理解多变量模型

  28. 28

    函数声明和变量声明的顶部是否有助于提高性能?

  29. 29

    如何从Linux驱动程序访问和调试FDT / DTS设备树(seg-fault)

热门标签

归档