【问题标题】:SIGACTION StructureSIGACTION 结构
【发布时间】:2018-03-31 22:22:58
【问题描述】:

我已经构建了一个函数(基于示例),它允许我忽略信号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 不同的东西,但它不起作用。为什么NULLsigaction中的那个NULL是什么意思?

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

【问题讨论】:

  • 我已经读过同一个网页但我还是不明白...
  • 具体有什么不明白的?手册页逐字说明“如果 oldact 为非 NULL,则先前的操作将保存在 oldact 中。”对我来说,没有什么要理解的,但如果你仍然理解,请告诉我们它到底是什么。
  • 请问,究竟是什么“不起作用”?
  • OT:在许多其他函数中,从信号处理程序调用 printf() 是不省事的。

标签: c linux sigaction


【解决方案1】:

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(&lt;) 是无穷无尽的

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多