मैं किसी प्रक्रिया के किसी विशेष धागे को कैसे मार सकता हूं?


21
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

यह mypPID = 797 के साथ प्रक्रिया और विभिन्न SPID के साथ चार थ्रेड दिखाता है ।

मैं पूरी प्रक्रिया को मारे बिना इस प्रक्रिया के किसी विशेष धागे को कैसे मार सकता हूं। मैं समझता हूं कि कुछ मामलों में यह संभव नहीं हो सकता है जब उस विशेष धागे पर घातक निर्भरताएं हों। लेकिन, क्या यह किसी भी मामले में संभव है? हाँ, कैसे है?

मैंने कोशिश की kill 799और इस प्रक्रिया को ही समाप्त कर दिया गया। अब मुझे यकीन नहीं है क्योंकि यह निर्भरताएं थीं mypजो प्रक्रिया के बिना विफल हो गईं 800या क्योंकि हत्या सरल है व्यक्तिगत प्रक्रियाओं को मारने में सक्षम नहीं है।

जवाबों:


26

थ्रेड्स प्रक्रिया का एक अभिन्न हिस्सा हैं और इसे इसके बाहर नहीं मारा जा सकता है। नहीं है pthread_kill समारोह लेकिन यह केवल धागा ही के संदर्भ में लागू होता है। लिंक पर डॉक्स से:

ध्यान दें कि pthread_kill () केवल दिए गए धागे के संदर्भ में सिग्नल को नियंत्रित करने का कारण बनता है; सिग्नल क्रिया (समाप्ति या रोक) प्रक्रिया को संपूर्ण रूप से प्रभावित करती है।


+1। बस यहाँ जोड़ने के लिए। प्रक्रिया के भीतर आप pthread_kill () का उपयोग करके व्यक्तिगत थ्रेड को सिग्नल भेज सकते हैं। हो सकता है कि आप कुछ सिग्नल हैंडलर जोड़ सकते हैं जो यह करते हैं।
हेमंत

@ शेमंट: मान लीजिए कि एमएस वर्ड वर्तनी जांच के लिए एक अलग थ्रेड का उपयोग करता है। उस धागे को मारते हुए पूरी चीज़ को नीचे नहीं लाना चाहिए, जब तक कि उसे उस तरह से डिज़ाइन न किया जाए। इन जैसी स्थितियों में प्रक्रिया उस धागे के बिना क्यों नहीं हो सकती है?
लेज़र

1
खैर, मुझे लगता है कि आप मूल प्रक्रिया से स्वतंत्र होने के लिए एक थ्रेडिंग मॉडल तैयार कर सकते हैं, लेकिन बाहर की प्रक्रियाओं को इंट्रा-प्रोसेस थ्रेड्स को मारने की अनुमति देते हैं, लेकिन सुरक्षा, प्रक्रिया प्रबंधन और सिस्टम अखंडता के संबंध में कीड़े का एक कैन खोलता है जो मैं डॉन ' टी किसी भी सिस्टम डिजाइनर स्वेच्छा से खुद को प्रस्तुत करने के लिए लगता है। थ्रेडिंग उन प्रकार के सिरदर्द के बिना काफी कठिन है। अंदर से एक धागा को मारना कोई समस्या नहीं है क्योंकि काम माता-पिता की प्रक्रिया द्वारा किया जाता है जो किसी भी मुद्दे पर उत्पन्न होने पर जिम्मेदार ठहराया जाता है और मारा जा सकता है - स्वचालित रूप से या अन्यथा।
gvkv

"जब तक इसे इस तरह से डिज़ाइन नहीं किया जाता है": धागे का उपयोग करने का मुख्य कारण बिल्कुल ऐसा है कि आप संसाधनों को साझा कर सकते हैं। यह आधा घर खटखटाने जैसा है।
14:50 बजे pjc50

2
@ लेज़र, एक थ्रेड वर्तनी की जाँच नहीं कर सकता है क्योंकि एक और थ्रेड टेक्स्ट को अपडेट कर रहा है क्योंकि आप टाइप कर रहे हैं। इस वजह से, बैकग्राउंड स्पेलिंग थ्रेड की जांच करने के लिए, इसे कुछ ऐसा करना चाहिए जैसे कि टेक्स्ट को बदलने से दूसरे धागे को रोकने के लिए लॉक को पकड़ना, कुछ शब्दों की कॉपी बनाना, लॉक को रिलीज़ करना, फिर कॉपी किए गए शब्दों को चेक करना पृष्ठभूमि। यदि आप इसे लॉक करते समय मारने के लिए हुए थे, तो आप टाइप करने का प्रयास करते ही दूसरे धागे को लटका देंगे। मल्टीथ्रेडेड एप्लिकेशन इस तरह अंतर निर्भरता से भरे हुए हैं।
Psusi

6

इस सवाल का विहित जवाब है: प्रक्रिया के सहयोग से, जो भी तंत्र इसे प्रदान करता है। प्रक्रिया के सहयोग के बिना, यह असंभव है। इस प्रक्रिया में थ्रेड्स शामिल होते हैं, यह प्रक्रिया का एक आंतरिक विवरण होता है, जो कि जानबूझकर डिजाइन द्वारा होता है, प्रक्रिया के बाहर उजागर नहीं होता है।


और कमांड लाइन से अन्य सिग्नल भेजने के बारे में क्या?
yucer

@yucer मुझे यकीन नहीं है कि मैं समझता हूं कि आप क्या पूछ रहे हैं।
डेविड श्वार्ट्ज

मेरा मतलब है "किल-एल" द्वारा दिखाई गई सूची से एक और संकेत भेजना। मैं यह देखने के लिए स्टैक ट्रेस को डंप करने के लिए किसी विशेष थ्रेड को कमांड करने के तरीके की तलाश कर रहा हूं कि यह क्या कर रहा है।
17

@ आपका निर्माता प्लेटफॉर्म-विशिष्ट होने जा रहा है। कुछ स्टैक डंप करने के लिए एक विशेष थ्रेड को कमांड करने का एक तरीका प्रदान करते हैं। व्यक्तिगत रूप से, मैंने gdbप्रक्रिया में डिबगर (जैसे ) को संलग्न करने के लिए स्क्रिप्ट का उपयोग करना आसान बना दिया है, स्टैक को डंप करने के लिए सभी थ्रेड्स को कमांड करें, और फिर अलग करें।
डेविड श्वार्ट्ज

1

@ Gkv के उत्तर के शीर्ष पर, आप फ़ंक्शन pthread_cancel(3), के भाग पर एक नज़र डाल सकते हैं <pthread.h>। आदमी पृष्ठ से:

Pthread_cancel () फ़ंक्शन थ्रेड थ्रेड के लिए रद्दीकरण अनुरोध भेजता है। चाहे और जब लक्ष्य थ्रेड रद्द करने के अनुरोध पर प्रतिक्रिया करता है, दो विशेषताओं पर निर्भर करता है जो उस थ्रेड के नियंत्रण में हैं: इसकी रद्द करने की स्थिति और प्रकार।


1

आप tgkill () उपयोगी हो सकते हैं । यह लिनक्स विशिष्ट है क्योंकि मैन पेज का उल्लेख है।

tgkill () थ्रेड आईडी tgid में थ्रेड ID tid के साथ थ्रेड को सिग्नल सिग भेजता है। (इसके विपरीत, किल (2) का उपयोग केवल एक प्रक्रिया को संकेत भेजने के लिए किया जा सकता है (यानी, थ्रेड समूह) एक पूरे के रूप में, और संकेत उस प्रक्रिया के भीतर एक मनमाने धागे को दिया जाएगा।)


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