在其中一个线程中,我必须等待特定的实时信号,但我不明白为什么在等待特定信号之前,首先必须为线程设置整个sigmask。

    sigset_t signals;
    siginfo_t info;

    sigfillset(&signals);
    sigdelset(&signals, SIGRTMIN+1);

        //why do we need this?
    pthread_sigmask(SIG_SETMASK, &signals, NULL);

    sigemptyset(&signals);
    sigaddset(&signals, SIGRTMIN+1);
    sigwaitinfo(&signals, &info);
    printf("This is thread %d %d\n", pthread_self(), info.si_value.sival_int);


最佳答案

通过查看代码,开发人员似乎希望暂停线程的执行,直到SIGRTMIN+1成为线程的挂起(sigwaitinfo(2))。同时,他不希望线程执行受到其他信号的干扰(即线程不应对除SIGRTMIN+1以外的任何信号作出反应),因此他使用以下语句屏蔽了其他信号:

//why do we need this?
    pthread_sigmask(SIG_SETMASK, &signals, NULL);

这里要注意的一点是,即使使用上述语句屏蔽了除SIGRTMIN+1之外的所有信号,线程执行总是倾向于SIGSTOPSIGKILL.

08-17 04:57