हम एक CRIU प्रोजेक्ट (चेकपॉइंट / रिस्टोर इन यूजर्सस्पेस) विकसित कर रहे हैं और हमारे पास मूल प्रक्रिया पेड़ को पुनर्स्थापित करने के तरीके पर एक दिलचस्प काम था। मेरा सुझाव है कि आप इसे हल करने का प्रयास करें।
कार्य
CRIU एक उपयोगिता है जो आपको डिस्क या किसी अन्य मशीन पर बाद में डिस्क को संसाधित करने की स्थिति को बचाने और उन्हें हल करने की अनुमति देती है। रिकवरी सबटेस में से एक प्रक्रिया पेड़ को पुनर्स्थापित करने के लिए कार्यों का एक क्रम खोजना है। इनपुट में प्रत्येक प्रक्रिया के लिए मापदंडों का एक सेट होता है: एक विशिष्ट पहचानकर्ता (पीआईडी), माता-पिता (पीपीआईडी) के लिए एक लिंक, और एक सत्र पहचानकर्ता (एसआईडी)।

नियम जिसके द्वारा लिनक्स प्रक्रियाएं चलती हैं
- लिनक्स प्रक्रिया पदानुक्रम में एक पेड़ की संरचना होती है।
- प्रत्येक प्रक्रिया में एक अद्वितीय पीआईडी (प्रक्रिया आईडी) है
- प्रत्येक प्रक्रिया में एक SID (सत्र ID) होता है। यह माता-पिता से विरासत में मिला है, और किसी भी समय, प्रक्रिया एक नेता बनने का फैसला कर सकती है, जिसके बाद इसकी एसआईडी पीआईडी के बराबर होगी।
- यदि प्रक्रिया मर जाती है, तो इसकी सभी बच्चे की प्रक्रिया निकटतम पूर्वज के पास चली जाती है, जो कि बाल-पुच्छक है, और यह प्रक्रिया स्वयं "ज़ोंबी" अवस्था में चली जाती है।
- एक अभिभावक बेटी की किसी भी लाश को उठा सकता है (नष्ट कर सकता है)।
- रूट प्रक्रिया हमेशा एक बच्चे की पुनरावृत्ति होती है, बाकी वैकल्पिक होती हैं (वे किसी भी समय इस कार्यक्षमता को चालू और बंद कर सकते हैं)।
- प्रक्रियाएं न केवल नीचे (बेटी बनने के लिए) पैदा हो सकती हैं, बल्कि पक्ष (भाई बनने) के लिए भी हो सकती हैं।
टीमें:
- कांटा (पीआईडी) - दिए गए पीआईडी के साथ एक प्रक्रिया बनाता है, जो वर्तमान का एक बच्चा बन जाएगा
- क्लोन (pid, CLONE_PARENT) - दिए गए PID के साथ एक प्रक्रिया बनाई जाती है, जो करंट के लिए भाई बनेगी
- prctl (PR_SET_CHILD_SUBREAPER, ध्वज) - कहता है कि वर्तमान प्रक्रिया बाल-पुन: उत्तीर्ण होगी यदि ध्वज = सत्य और यह कि वर्तमान प्रक्रिया ध्वज-असत्य होने पर बाल-पुनः होने से इंकार करती है।
- setid () - वर्तमान प्रक्रिया को सत्र का नेता बनाता है।
- बाहर निकलें () - प्रक्रिया मर जाती है, लेकिन गायब नहीं होती है, लेकिन "ज़ोंबी" स्थिति में प्रवेश करती है। उसके सभी वंशज निकटतम बच्चे के पास जाते हैं।
- प्रतीक्षा (पीआईडी) - दिए गए पीआईडी के साथ लाश का चयन (नष्ट) करता है। यह ऑपरेशन केवल एक ज़ोंबी माता-पिता द्वारा किया जा सकता है।
नमूना इनपुट
इनपुट डेटा में प्रत्येक प्रक्रिया के लिए एक पंक्ति होती है। प्रत्येक पंक्ति में 3 नंबर होते हैं pid, ppid (पैरेंट का पैर), सिड और ज़ोंबी फ्लैग, जिसका मान 0 होता है - यदि प्रक्रिया मृत है ("ज़ोंबी"), और 1 - यदि प्रक्रिया जीवित है।
1 0 1 1
६ १ ६ १
7 ६ 7 १
१५ ६ १२ १
१० १ १ १ १
११ १० 7 १
१३ १० १२ १
नमूना उत्पादन
1: कांटा (6)
6: कांटा (7)
7: सेटिड ()
7: क्लोन (8, CLONE_PARENT)
7: निकास ()
6: प्रतीक्षा ()
8: कांटा (9)
9: कांटा (10)
10: कांटा (11)
10: कांटा (12)
12: सेटिड ()
12: क्लोन (13, CLONE_PARENT)
12: क्लोन (14, CLONE_PARENT)
12: निकास ()
10: प्रतीक्षा (12)
14: कांटा (15)
6: prctl (PR_SET_CHILD_SUBREAPER, 1)
14: निकास ()
10: प्रतीक्षा (14)
6: prctl (PR_SET_CHILD_SUBREAPER, 0)
9: बाहर निकलें ()
8: प्रतीक्षा (9)
6: सेटिड ()
10: सेटिड ()