कैसे लिनक्स में एक प्रक्रिया के तहत एक व्यक्तिगत धागे को मारने के लिए?


13

यहाँ छवि विवरण दर्ज करें

ये पैकेट रिसीवर प्रक्रिया के अलग-अलग सूत्र हैं। क्या किसी भी व्यक्तिगत धागे को मारने का कोई तरीका है? क्या लिनक्स किसी भी विशिष्ट कमांड को प्रदान करता है जो किसी प्रक्रिया के तहत किसी विशेष धागे को स्टॉप सिग्नल को मार या भेज सकता है?


आपका पैकेट प्राप्तकर्ता कार्यक्रम क्या है? (मेरे पास मेरे डेबियन डेस्कटॉप पर नहीं है) कृपया अधिक बताएं, शायद कुछ लिंक प्रदान करें। इसलिए अपने प्रश्न को सुधारने के लिए संपादित करें
बेसिल स्टारीनेवविच

1
मुझे लगता है कि आपको एहसास नहीं है कि "स्टॉप" सिग्नल एक प्रक्रिया को रोकता है, चाहे आप इसे किस थ्रेड में भेजें।
डेविड श्वार्ट्ज


1
@ Md.Kawsaruzzaman जो अभी काम नहीं करेगा। मान लीजिए, उदाहरण के लिए, थ्रेड मेमोरी आवंटित करने के बीच में है और मेमोरी एलोकेटर पर लॉक रखता है। यदि आप थ्रेड को रोकते हैं, तो यह लॉक को कभी जारी नहीं करेगा और अंततः अन्य थ्रेड्स भी बंद हो जाएंगे। जो कुछ भी आप यह करने की कोशिश कर रहे हैं, यह ऐसा करने का तरीका नहीं है। (ऐसा हो सकता है कि आप उस काम को रोकना चाहते हैं जिसे थ्रेड करने से हो रहा है। लेकिन आपको इसे करने के लिए प्रक्रिया के सहयोग की आवश्यकता है। यदि यह करने का कोई तरीका प्रदान नहीं करता है, तो यह नहीं किया जा सकता है।)
डेविड Schwartz

1
यह भी ध्यान दें कि, आपके स्क्रीनशॉट में, प्रत्येक "थ्रेड" में एक अलग पीआईडी ​​है। मुझे यकीन नहीं है कि आप अलग-अलग थ्रेड्स को भी लक्षित कर सकते हैं, क्योंकि सिग्नल केवल प्रक्रियाओं के लिए भेजे जा सकते हैं।
szalski

जवाबों:


16

यह आम तौर पर एक बड़ी प्रक्रिया से एक व्यक्ति के धागे को मारने के लिए बहुत खतरनाक है। वह धागा हो सकता है:

  • अन्य थ्रेड्स के साथ कुछ साझा स्थिति को संशोधित करें जो दूषित हो सकते हैं
  • कुछ ताला पकड़े रहें जो कभी मुक्त न हो, जिससे ताला अनिश्चित काल के लिए अनुपलब्ध हो जाए
  • ... या किसी भी अन्य चीज़ों की वजह से अन्य धागे गलत हो सकते हैं।

सामान्य तौर पर, एप्लिकेशन के बाहर प्रबंधन और सिंक्रनाइज़ेशन के बाहर, व्यक्तिगत थ्रेड्स को मारना कुछ ऐसा नहीं है जो करने के लिए समझ में आता है।


5
यह बिलकुल भी उपयोगी नहीं है। ओपी लिए पूछ रहा है कि कैसे उन्हें करना चाहिए या नहीं है कि क्या, एक धागा को मारने के लिए।
मार्टिन

मैं जो चाहता हूं वह किसी उद्देश्य के लिए किसी विशेष धागे को मारने या रोकने की प्रक्रिया है। मुझे लगता है कि कुछ त्रुटि के कारण, कभी-कभी हमारा रिसीवर स्वचालित रूप से बंद हो रहा है। हम कारणों का पता लगा रहे हैं क्योंकि कार्यक्रम हमारे अपने आर एंड डी द्वारा विकसित किया गया है। अब बात यह है कि संभावना है कि कुछ धागे स्वतः बंद हो रहे हैं। हमने कोड साइड से परीक्षण किया है और पाया है कि बच्चा धागा स्वतंत्र है, लेकिन सर्वर साइड से अभी भी कभी-कभी कुछ थ्रेड डाउन हो रहे हैं, जिसके कारण कुल प्रक्रिया भी बंद हो जाती है ..
म.द.कवरसुज्जमान

12

आप 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 के बिना भी)।


4
tgkillसमारोह एक धागा समाप्त करने के लिए कोई रास्ता नहीं है प्रदान करता है। यह एक थ्रेड को सिग्नल भेजता है। इसे "मार" नाम दिया गया है क्योंकि यह एक प्रक्रिया को मारने का ऐतिहासिक तरीका है और इसका उपयोग किसी धागे को मारने के लिए नहीं किया जा सकता है।
डेविड श्वार्ट्ज

मुझे लगता है कि SIGKILLएक थ्रेड भेजना नुकसान पहुंचा रहा है। या यह हमेशा पूरी प्रक्रिया को मार रहा है? और किस बारे में SIGTERM? बीटीडब्लू, भले ही केवल एक धागे को नुकसान पहुंचाया गया हो, मेरा कहना यह है कि यह प्रक्रिया काफी गंभीर है।
बेसिल स्टारीनेवविच 18

5
हां, SIGKILLऔर SIGTERMसंकेतों को प्रक्रिया को मारने या समाप्त करने के लिए परिभाषित किया गया है। यह सच है कि चाहे जो भी धागा उन्हें प्राप्त हो - उनका मतलब अभी भी वही है। अपनी प्रक्रिया के घनिष्ठ सहयोग के बिना एक धागा को समाप्त करना एक बकवास शूट और इस प्रक्रिया के लिए संभावित विनाशकारी होगा।
डेविड श्वार्ट्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.