如何安装信号处理器 SIGUSR1 和 SIGUSR2?

如何安装信号处理器 SIGUSR1 和 SIGUSR2?

默认情况下,用户信号 SIGUSR1 和 SIGUSR2 终止进程或线程。如何让他们设置他们的处理程序?我尝试阅读有关该主题的各种文章,但由于我是该主题的新手,因此不可能根据我的需要进行转移。

需求如下 - 有许多生产者线程(pthread)在循环中执行一系列指令,并且在每次迭代结束时,它们等待来自主消费者线程的信号(sigwait)SIGURS1,并且仅接收到信号后进入下一次迭代。但由于默认完成,因此它们已完成。

那些。在这里,我们只需要接收这些信号即可过渡到下一次迭代,它们就完成了该过程。

答案1

有许多 API 可用于设置信号处理程序,我将举例说明其中之一:

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

static void signal_handler(int signo)
{
#       define signal_message "Signal received\n"
        write(1, signal_message, strlen(signal_message));
#       undef signal_message
}

int main(void)
{
        struct sigaction new_handler = {
                .sa_handler = signal_handler,
        };

        if (sigaction(SIGUSR1, &new_handler, NULL) < 0) {
                perror("sigaction");
        }

        pause();

        return 0;
}

sigaction()函数可以安装新的信号处理程序,其签名为:

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

第一个参数是信号号(例如,SIGUSR1第二个参数是指向具有处理详细信息的结构的指针struct sigaction,第三个参数是指向struct sigaction将在其中存储处理程序的旧值的指针。第三个参数可以是NULL如果你不关心旧的价值。

其中一个字段struct sigactionsa_handler——这是一个指向信号处理函数的指针。该函数的签名必须是:

void function_name(int signo);

该函数返回void并接受接收到的信号号作为参数。

综上所述,该示例安装了 的信号处理程序SIGUSR,然后调用pause(),这将暂停执行,直到收到任何信号。如果我随后将SIGUSR信号传递给运行此代码的进程,它将打印Signal received到标准输出。

相关内容