ये पैकेट रिसीवर प्रक्रिया के अलग-अलग सूत्र हैं। क्या किसी भी व्यक्तिगत धागे को मारने का कोई तरीका है? क्या लिनक्स किसी भी विशिष्ट कमांड को प्रदान करता है जो किसी प्रक्रिया के तहत किसी विशेष धागे को स्टॉप सिग्नल को मार या भेज सकता है?
ये पैकेट रिसीवर प्रक्रिया के अलग-अलग सूत्र हैं। क्या किसी भी व्यक्तिगत धागे को मारने का कोई तरीका है? क्या लिनक्स किसी भी विशिष्ट कमांड को प्रदान करता है जो किसी प्रक्रिया के तहत किसी विशेष धागे को स्टॉप सिग्नल को मार या भेज सकता है?
जवाबों:
यह आम तौर पर एक बड़ी प्रक्रिया से एक व्यक्ति के धागे को मारने के लिए बहुत खतरनाक है। वह धागा हो सकता है:
सामान्य तौर पर, एप्लिकेशन के बाहर प्रबंधन और सिंक्रनाइज़ेशन के बाहर, व्यक्तिगत थ्रेड्स को मारना कुछ ऐसा नहीं है जो करने के लिए समझ में आता है।
आप tgkill (2) या tkill
अपने C प्रोग्राम में उपयोग कर सकते हैं (आपको syscall (2) का उपयोग करने की आवश्यकता होगी ) लेकिन आप नहीं चाहते हैं । अपने कार्यक्रम के अंदर से आप pthread_kill (3) का उपयोग कर सकते हैं - जो शायद ही कभी उपयोगी होता है।
(मुझे नहीं पता कि क्या प्रभाव होगा tgkill
या tkill
- जैसे कि एक धागे पर SIGKILL
या SIGTERM
-
Pthreads (7) पुस्तकालय का उपयोग करता है निम्न स्तर के सामान (कुछ सहित संकेत (7) -s और futex (7) -s आदि ...; देख भी NPTL (7) ) और यदि आप कच्चे मारे गए (साथ tkill
या tgkill
) कुछ अलग-अलग सूत्र, आपकी प्रक्रिया कुछ गलत स्थिति (इसलिए अपरिभाषित व्यवहार ) में होगी क्योंकि कुछ आंतरिक आक्रमण टूट जाएंगे।
इसलिए अपने पैकेट रिसीवर प्रोग्राम के दस्तावेज़ीकरण का अध्ययन करें और कोई अन्य तरीका खोजें। यदि यह मुफ्त सॉफ्टवेयर है , तो इसके स्रोत कोड का अध्ययन करें और इसमें सुधार करें।
अधिक ध्यान से पढ़ें संकेत (7) और संकेत-सुरक्षा (7) । संकेत प्रक्रियाओं ( मार (2) द्वारा ) और थ्रेड्स में संभाले जाने के लिए हैं।
और व्यवहार में, संकेत और धागे अच्छी तरह से शादी नहीं करते हैं। कुछ पढ़े हुए ट्यूटोरियल देखें ।
एक सामान्य ट्रिक, जब एक मल्टी-थ्रेडेड प्रोग्राम को कोड करना (और जैसे बाहरी सिग्नल को हैंडल करना चाहते हैं SIGTERM
) एक पाइप (7) का उपयोग अपनी प्रक्रिया और पोल (2) के लिए करना है जो किसी अन्य थ्रेड में पाइप (आप लिनक्स पर भी विचार कर सकते हैं) विशिष्ट सिग्नलफेड (2) ), एक सिग्नल हैंडर के साथ (2) -एक बाइट या उनमें से कुछ को उस पाइप में लिखना । यह अच्छी तरह से ज्ञात चाल को Qt प्रलेखन में अच्छी तरह से समझाया गया है (और आप इसे अपने कार्यक्रम में भी उपयोग कर सकते हैं, यहां तक कि Qt के बिना भी)।
tgkill
समारोह एक धागा समाप्त करने के लिए कोई रास्ता नहीं है प्रदान करता है। यह एक थ्रेड को सिग्नल भेजता है। इसे "मार" नाम दिया गया है क्योंकि यह एक प्रक्रिया को मारने का ऐतिहासिक तरीका है और इसका उपयोग किसी धागे को मारने के लिए नहीं किया जा सकता है।
SIGKILL
एक थ्रेड भेजना नुकसान पहुंचा रहा है। या यह हमेशा पूरी प्रक्रिया को मार रहा है? और किस बारे में SIGTERM
? बीटीडब्लू, भले ही केवल एक धागे को नुकसान पहुंचाया गया हो, मेरा कहना यह है कि यह प्रक्रिया काफी गंभीर है।
SIGKILL
और SIGTERM
संकेतों को प्रक्रिया को मारने या समाप्त करने के लिए परिभाषित किया गया है। यह सच है कि चाहे जो भी धागा उन्हें प्राप्त हो - उनका मतलब अभी भी वही है। अपनी प्रक्रिया के घनिष्ठ सहयोग के बिना एक धागा को समाप्त करना एक बकवास शूट और इस प्रक्रिया के लिए संभावित विनाशकारी होगा।