2012-01-06 16 views
17

क्या लिनक्स सिंक्रोनस में kill फ़ंक्शन है? कहें, मैं प्रक्रिया को समाप्त करने के लिए kill फ़ंक्शन को प्रोग्रामेटिक रूप से कॉल करता हूं, क्या यह केवल तभी वापस आ जाएगा जब इच्छित प्रक्रिया समाप्त हो जाती है, या यह सिग्नल भेजती है और वापस आती है। यदि ऐसा है, तो मैं इच्छित प्रक्रिया को मारने के लिए इसे कैसे इंतजार कर सकता हूं?हत्या समारोह सिंक्रोनस है?

+2

अनजाने में, मैं नहीं कह सकता, क्योंकि मैंने प्रक्रिया पर 'हत्या' का उपयोग किया है, इसे वापस करने के लिए और प्रक्रिया अभी भी मौजूद है। फिर 'मार -9' करना था। –

+1

नोट: सभी सिग्नल जो आप किसी प्रक्रिया को भेज सकते हैं * * इसे समाप्त नहीं करेंगे - यहां तक ​​कि '1234 मार डालें' ('SIGTERM' का उपयोग करके) फंस और बाईपास किया जा सकता है। बिना शर्त तरीके से मारने का एकमात्र तरीका 'kill -9' का उपयोग करना है, जो क्रूर है (सफाई के लिए कोई मौका नहीं है)। – Piskvor

+1

यहां तक ​​कि 'हत्या -9' भी हमेशा इसे मारता है, क्योंकि कुछ राज्य (विशेष रूप से, राज्य "डी") होते हैं जिसमें यह तब तक मर नहीं जाएगा जब तक कि कर्नेल थ्रेड खत्म नहीं हो जाता। –

उत्तर

18

नहीं, चूंकि यह कुछ भी नहीं मारता है, यह केवल प्रक्रिया को संकेत भेजता है।

डिफ़ॉल्ट रूप से इस सिग्नल को भी अवरुद्ध या अनदेखा किया जा सकता है।

आप kill -9 नहीं रोक सकते हैं जो SIGKILL

भेजने को दर्शाता प्रक्रिया मरने के लिए के लिए प्रतीक्षा करने के लिए:

while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 
+0

+1 जब तक पिड खत्म नहीं हो जाता है, प्रतीक्षा करने की एक सरल विधि दिखाने के लिए +1। –

+0

सिगकिल को किसी प्रक्रिया द्वारा अवरुद्ध या अनदेखा नहीं किया जा सकता है। लेकिन आप सही हैं कि प्रक्रिया तुरंत समाप्त नहीं होगी। यदि कोई प्रक्रिया सिस्टम कॉल कर रही है, तो यह केवल तभी समाप्त होगा जब सिस्टम कॉल रिटर्न हो। तो अगर यह कुछ वास्तविक भारी प्रसंस्करण करता है, तो इसमें समय लग सकता है। – ugoren

+1

यह मरने से इंकार कर देगा अगर यह 'अनइंटरप्टीबल' की स्थिति में है –

3

मार सिस्टम कॉल कुछ भी करने को अन्य प्रक्रिया के लिए प्रतीक्षा नहीं करता है। संकेत लक्ष्य प्रक्रिया और सिस्टम कॉल रिटर्न पर पोस्ट किया गया है। लक्षित प्रक्रिया सिग्नल को नोटिस करती है जब इसे चलाने के लिए निर्धारित किया जाता है।

4

kill सिंक्रोनस नहीं हो सकता क्योंकि यह केवल सिग्नल भेजता है। लक्ष्य प्रक्रिया इनकमिंग सिग्नल (सीएफ SIG_IGN) को अनदेखा कर सकती है, इसलिए kill के प्रभाव के बारे में कोई गारंटी नहीं है।

इस परिकल्पना को सत्यापित करने के लिए प्रयोग करना मुश्किल नहीं होना चाहिए। प्रक्रिया ए शुरू करें और इसे मरने से पहले 10 सेकंड नींद के साथ SIGTERM संभाल लें। फिर प्रक्रिया बी शुरू करें, जो SIGTERM ए को वितरित करता है और तुरंत बाहर निकलता है।

3
  1. सं man 2 kill
  2. man wait

भी देखें man 7 signal यूनिक्स संकेतों के बारे में अधिक जानकारी के लिए।

संबंधित मुद्दे