Gibt es eine Möglichkeit, bestimmte Signale zu blockieren und andere Signale in das gleiche Set zu entsperren?
Mit pthread_sigmask
, können Sie entweder:
- einen Satz von Signalen auf den Satz von blockierten Signale hinzufügen, mit der konstanten
SIG_BLOCK
- entfernen, um einen Satz von Signalen auf den Satz von blockiert Signale, die konstanten
SIG_UNBLOCK
- definiert den Satz von Signalen unter Verwendung blockiert werden, die konstante
SIG_SET
Verwendung
Mit anderen Worten, es gibt einen aktuellen Satz blockierter Signale für den Thread, und Sie können ihn wie oben beschrieben einzeln ändern.
Der wichtige Punkt ist, dass neu erstellte Threads die Signalmaske des erzeugenden Threads erben, so dass Sie die Maske des neuen Threads direkt vor dem Erstellen oder in der Funktion, die der neue Thread ausführen wird, nach Belieben festlegen können .
In Bezug auf Ihr Beispiel, nehme ich an, dass Sie printer_thread1
Block SIGUSR2
und SIGALRM
, haben versuchen und haben printer_thread2
Block SIGUSR1
und SIGALRM
und haben den Haupt-Thread Block SIGUSR1
und SIGUSR2
, so dass jeder Thread ein Signal senden kann, das wird von einem einzigen Thread abgefangen werden (ohne den Code print
, f1
und f2
, ist es unmöglich zu wissen, was Ihre Absicht in Ihrem Beispiel ist).
soll es möglich sein, dass durch den folgenden Code zu erreichen:
sigset_t set;
pthread_t printer_thread1, printer_thread2;
// Block signal SIGUSR1 & SIGALRM in printer_thread1
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread1, NULL, print, (void *)&f1);
// Block signal SIGUSR2 & SIGALRM in printer_thread2
sigaddset(&set, SIGUSR2);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread2, NULL, print, (void *)&f2);
// Block signal SIGUSR1 & SIGUSR2 in the main thread
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
// Listen to signal SIGALRM
pthread_sigmask(SIG_SET, &set, NULL);
bool tl = true;
while(1)
{
if(tl)
{
// thread1 does something
kill(pid, SIGUSR1);
// main thread waits for SIGALRM
sigwait(&set, &sig);
tl = !tl;
}
else
{
// thread2 does something
kill(pid, SIGUSR2);
// main thread waits for SIGALRM
sigwait(&set, &sig);
tl = !tl;
}
}
sehen diesen Manpages:
für weitere Details.
Blockieren und entblockieren Sie SIGUSR1 nicht zuerst? Zur Zeit des UNBLOCK enthält die Menge sowohl SIGUSR1 als auch SIGALRM. – amaurea