gpt4 book ai didi

c - linux 中 c 的信号处理

转载 作者:IT王子 更新时间:2023-10-29 00:40:35 24 4
gpt4 key购买 nike

我试图通过我在网上找到的示例程序来了解信号在 Linux 中的工作方式,但它有一些我不太了解的部分。

这是我的示例程序:

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

void catcher(int sig) {
printf("catcher() has gained control\n");
}

int main(int argc, char *argv[]) {
struct sigaction sigact;
sigset_t sigset;

sigemptyset(&sigact.sa_mask);
sigact.sa_flags = 0;
sigact.sa_handler = catcher;
sigaction(SIGUSR1, &sigact, NULL);

printf("before first kill()\n");
kill(getpid(), SIGUSR1);

sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_SETMASK, &sigset, NULL);

printf("before second kill()\n");
kill(getpid(), SIGUSR1);
printf("after second kill()\n");

return 0;
}

这是我程序的示例输出:

before first kill()
catcher() has gained control
before second kill()
after second kill()

我能知道为什么输出中的第一行是 before first kill() 吗?为什么 catcher() has gained control 没有先出现?

据我所知,sa_handler 由两种类型的信号组成,信号默认和信号忽略。

我们怎么知道它会产生哪个信号?如果忽略生成的信号,为什么会触发打印 catcher() 已获得控制权的函数?

另外,这个程序中的sa_mask函数是什么?在我的理解中,sa_mask 将阻止指定的信号。

最佳答案

Can I know why the first line in the output is before first kill()? Why doesn't catcher() has gained control appear first?

您安装了一个信号处理程序来捕获 SIGUSR1。在 SIGUSR1 被传递给进程之前,正常的程序执行流程一直在发生。所以,在这里:

printf("before first kill()\n");
kill(getpid(), SIGUSR1);

您仅在打印before first kill() 之后生成信号。您为什么不希望它在 catcher() 获得控制权 之前出现?换句话说,当你调用 printf("before first kill()\n"); 时,还没有发出信号,所以你只能期望程序执行保持正常。

这一行:

kill(getpid(), SIGUSR1);

生成 SIGUSR1。操作系统在方便的时候将信号传递给进程。因为您为 SIGUSR1 安装了一个处理程序,所以您的信号处理程序 (catcher()) 被调用。您在打印第一行后发出信号,因此可以预期下一行输出将来自信号处理程序。

请注意 printf(3) 不是异步信号安全的,因此从技术上讲您不能从信号处理程序内部调用它,但对于这些玩具示例来说通常没问题。

From what I know, sa_handler consists of two types of signal, signal default and signal ignore.

不止于此。 struct sigactionsa_handler字段可以取值为SIG_DFL,对应默认信号 Action (默认 Action 在中列出) man signal) 和 SIG_IGN,这意味着信号被忽略(发出时什么也没有发生)。但是 sa_handler 也可以是指向您希望在每次传递信号时调用的函数的指针。这就是您显示的代码正在做的事情 - 它说:嘿,当 SIGUSR1 交付时,请调用 catcher()。 p>

How do we know which signal it will generate? Why would it trigger the function to print the catcher() has gained control if the signal ignore being generate?

当您调用 sigaction(2) 设置处理程序时,您指示了一个信号 (SIGUSR1)。因此,catcher() 将在 SIGUSR1 被传送时被调用。

Besides, what is the sa_mask function in this program? In my understanding, sa_mask will block the specified signal.

这是一个信号掩码,在进入信号处理程序时自动安装,并在信号处理程序返回时卸载。默认情况下,即使您向它传递一个空掩码,被捕获的信号在进入处理程序时始终会被阻止(除非 SA_NODEFER 标志在 sa_flags 字段中设置 结构sigaction)。但是,您可能希望在处理程序执行时阻止其他信号 - 您可以通过在 sa_mask 中指示这些信号来实现。

关于c - linux 中 c 的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156258/

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