gpt4 book ai didi

c - SIGACTION结构

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:05 25 4
gpt4 key购买 nike

我已经构建了一个函数(基于示例),它允许我忽略信号 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 是什么意思?

附言:它如我所愿地工作

最佳答案

sigaction的声明是:

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

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

If oldact is non-NULL, the previous action is saved in oldact.

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

例如,修改你的代码如下:

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(<) 中。无穷无尽

关于c - SIGACTION结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49593009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com