0

我已经构建了一个函数(基于示例),它允许我忽略信号SIGINT。该函数计算用户按下的次数CONTROL + C(中断SIGINT)。功能如下

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

sig_atomic_t sigint_count = 0;

void handler (int signal_number)
{
    ++sigint_count;
    printf ("SIGINT was raised %d times\n", sigint_count);
}

int main ()
{
    struct sigaction sa; //Declaração da estrutura sigaction
    memset (&sa, 0, sizeof (sa));//Libertação da memória usada
    sa.sa_handler = &handler;
    sigaction (SIGINT, &sa, NULL);
    while(1);
    return 0;
}

我的疑问是关于这行代码

 sigaction (SIGINT, &sa, NULL);

我试图写另一个不同的东西,NULL但它不起作用。为什么NULLNULL那是什么意思sigaction

PS:它可以按我的意愿工作

4

1 回答 1

0

sigaction 的声明是:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

旧动作,即您要替换的动作,被写入第三个参数中的指针。如果你不需要这个结果,你可以提供 NULL 来忽略它。

如果 oldact 不为 NULL,则前一个操作保存在 oldact 中。

获取旧操作对于临时替换它很有用。

例如,像这样修改您的代码:

volatile sig_atomic_t sigint_count = 0;
...
    struct sigaction backup;
    sigaction (SIGINT, &sa, &backup);
    while(sigint_count < 10) {}
    sigaction (SIGINT, &backup, NULL);
    printf("^C again will terminate me.\n");
    while(1){}

声明sig_atomic_t变量,就volatile好像它是从并发上下文中访问的一样。如果不这样做,编译器可能会将值“缓存”在寄存器中,并且while(<)无穷无尽

于 2018-03-31T22:33:55.480 回答