使用switchcontext时在C中发出信号

使用switchcontext时在C中发出信号,c,signals,C,Signals,我尝试使用makecontext()、swapcontext()和getcontext()函数实现一个用户级线程库。我已经读到一个好的实践是使用信号来调度函数(使用循环计时器),但是当一个新线程添加时,阻塞信号 我的问题是:我可以实现阻止信号的功能,但当我使用上下文切换时它不起作用 void initSignals() { printf("initSignals\n"); act.sa_handler = schedule; sigemptyset(&act.sa

我尝试使用
makecontext()
swapcontext()
getcontext()
函数实现一个用户级线程库。我已经读到一个好的实践是使用信号来调度函数(使用循环计时器),但是当一个新线程添加时,阻塞信号

我的问题是:我可以实现阻止信号的功能,但当我使用上下文切换时它不起作用

void initSignals()
{
    printf("initSignals\n");
    act.sa_handler = schedule;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, &oact);
}


void blockSignals()
{
    printf("blockSignals\n");
    //sigset_t sig_mask;
    sigemptyset(&sig_mask);
    sigaddset(&sig_mask, SIGALRM);
    sigprocmask(SIG_BLOCK, &sig_mask, NULL);
}

void unblockSignals()
{
    printf("unblockSignals\n");
    //sigset_t sig_mask;
    sigemptyset(&sig_mask);
    sigaddset(&sig_mask, SIGALRM);
    sigprocmask(SIG_UNBLOCK, &sig_mask, NULL);
    runTimer();
}
关于
sigset\u t sig mask
现在它是全局变量,但我也尝试将其设置为局部变量。 此外,我还尝试使用另一个signals
SIGPROF,SIGVTALRM
,因为我的循环计时器如下所示:

void runTimer()
{
    printf("runTimer\n");
    it.it_interval.tv_sec = 1;
    it.it_interval.tv_usec = 0;
    it.it_value.tv_sec = 1;
    it.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL, &it, NULL);
}
itimer允许使用这3种类型的警报

所以问题是:当代码使用上下文切换函数时,如何阻止信号?可能吗?也许还有其他功能可以做到这一点


我以为所有进程都在使用信号,所以我很惊讶它不起作用……

通常用户空间线程是合作的,只有当当前线程表示可以通过调用屈服函数或其他潜在阻塞函数来切换时,才会进行切换。有关示例,请参见旧库。