默认情况下,用户信号 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 sigaction
是sa_handler
——这是一个指向信号处理函数的指针。该函数的签名必须是:
void function_name(int signo);
该函数返回void
并接受接收到的信号号作为参数。
综上所述,该示例安装了 的信号处理程序SIGUSR
,然后调用pause()
,这将暂停执行,直到收到任何信号。如果我随后将SIGUSR
信号传递给运行此代码的进程,它将打印Signal received
到标准输出。