क्या कुछ सिग्नल को अवरुद्ध करने और में अन्य सिग्नल अनब्लॉक करने का कोई तरीका है?
- अवरुद्ध संकेतों के सेट करने के लिए संकेत का एक सेट जोड़ने के लिए, निरंतर
SIG_BLOCK
- का उपयोग करके ब्लॉक के सेट करने के लिए संकेतों के एक समूह को हटाने:
pthread_sigmask
साथ
, तो आप या तो चुन सकते हैं संकेत, निरंतर SIG_UNBLOCK
संकेतों के सेट का उपयोग को परिभाषित अवरुद्ध होने, लगातार SIG_SET
का उपयोग कर
दूसरे शब्दों में, धागे के लिए अवरुद्ध संकेतों का एक वर्तमान सेट है, और आप इसे एक समय में एक ऑपरेशन के रूप में ऊपर निर्दिष्ट अनुसार संशोधित कर सकते हैं।
महत्वपूर्ण बात यह है कि नव निर्मित धागे बनाने वाले थ्रेड के सिग्नल मास्क का उत्तराधिकारी होता है, ताकि आप इसे बनाने से पहले नए धागे का मुखौटा सेट कर सकें, या उस समारोह में जो नया थ्रेड चलाएगा, आपकी सुविधा पर ।
अपने उदाहरण के बारे में, मुझे लगता है कि आप printer_thread1
ब्लॉक SIGUSR2
और SIGALRM
के लिए कोशिश कर रहे हैं, और printer_thread2
ब्लॉक SIGUSR1
और SIGALRM
है, और इतना है कि प्रत्येक थ्रेड एक संकेत है कि होगा भेज सकते हैं, मुख्य थ्रेड ब्लॉक SIGUSR1
और SIGUSR2
है एक थ्रेड द्वारा पकड़ा जा सकता है (print
, f1
और f2
के कोड के बिना, यह सुनिश्चित करना असंभव है कि आपके उदाहरण में आपका इरादा क्या है)।
आपको लगता है कि प्राप्त करने के लिए निम्न कोड से सक्षम होना चाहिए:
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;
}
}
इन आदमी पृष्ठों को देखने के:
अधिक जानकारी के लिए
।
क्या आप पहले सिंकसआर 1 को अवरुद्ध नहीं कर रहे हैं और फिर अनब्लॉक नहीं कर रहे हैं? UNBLOCK के समय, सेट में SIGUSR1 और SIGALRM दोनों शामिल हैं। – amaurea