फोर्क (सिस्टम कॉल): Difference between revisions

From Vigyanwiki
(Created page with "{{DISPLAYTITLE:fork (system call)}} {{short description|In computing, an operation whereby a process creates a copy of itself}} कम्प्यूटिंग मे...")
 
No edit summary
 
(7 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{DISPLAYTITLE:fork (system call)}}
{{DISPLAYTITLE:fork (system call)}}
{{short description|In computing, an operation whereby a process creates a copy of itself}}
{{short description|In computing, an operation whereby a process creates a copy of itself}}
[[ कम्प्यूटिंग ]] में, विशेष रूप से [[यूनिक्स]] ऑपरेटिंग सिस्टम और इसके [[UNIX- जैसे]] के संदर्भ में, फोर्क एक ऑपरेशन है जिससे एक [[कंप्यूटर प्रक्रिया]] स्वयं की एक प्रति बनाती है। यह एक इंटरफ़ेस है जो [[POSIX]] और सिंगल यूनिक्स विशिष्टता मानकों के अनुपालन के लिए आवश्यक है। यह आमतौर पर फोर्क, क्लोन या [[कर्नेल (ऑपरेटिंग सिस्टम)]] के अन्य [[सिस्टम कॉल]] के लिए C मानक लाइब्रेरी [[रैपर लाइब्रेरी]] के रूप में लागू किया जाता है। यूनिक्स जैसे ऑपरेटिंग सिस्टम पर फोर्क प्रक्रिया निर्माण की प्राथमिक विधि है।
[[ कम्प्यूटिंग |कम्प्यूटिंग]] में, विशेष रूप से [[यूनिक्स]] ऑपरेटिंग सिस्टम और [[UNIX- जैसे|यूनिक्स]] के संदर्भ में फोर्क एक संगणिकीय संक्रिया है जिससे एक [[कंप्यूटर प्रक्रिया]] स्वयं की एक प्रति बनाती है। यह एक इंटरफ़ेस है जो [[POSIX|पॉज़िक्स]] और सिंगल यूनिक्स विशिष्टता मानकों के अनुपालन के लिए आवश्यक है। यह सामान्यतः फोर्क, क्लोन या [[कर्नेल (ऑपरेटिंग सिस्टम)]] के अन्य [[सिस्टम कॉल]] के लिए मानक लाइब्रेरी C पर [[रैपर लाइब्रेरी]] के रूप में लागू किया जाता है। यूनिक्स जैसे ऑपरेटिंग सिस्टम पर फोर्क प्रक्रिया निर्माण की प्राथमिक विधि है।


== सिंहावलोकन ==
== अवलोकन ==
मल्टीटास्किंग ऑपरेटिंग सिस्टम में, प्रोसेस (चल रहे प्रोग्राम) को नई प्रोसेस बनाने के लिए एक तरीके की आवश्यकता होती है, उदा। अन्य कार्यक्रम चलाने के लिए। फोर्क और इसके प्रकार आमतौर पर यूनिक्स जैसी प्रणालियों में ऐसा करने का एकमात्र तरीका है। एक प्रक्रिया के लिए एक अलग कार्यक्रम का निष्पादन शुरू करने के लिए, यह पहले खुद की एक प्रति बनाने के लिए फोर्क करता है। फिर, कॉपी, जिसे चाइल्ड प्रोसेस कहा जाता है, दूसरे प्रोग्राम के साथ खुद को ओवरले करने के लिए निष्पादन (सिस्टम कॉल) सिस्टम कॉल को कॉल करती है: यह दूसरे के पक्ष में अपने पूर्व प्रोग्राम का निष्पादन बंद कर देती है।
मल्टीटास्किंग ऑपरेटिंग सिस्टम में, प्रोसेस (चल रहे प्रोग्राम) को नई प्रोसेस बनाने के लिए अन्य प्रोग्राम चलाने के लिए एक तरीके की आवश्यकता होती है। फोर्क और इसके प्रकार सामान्यतः यूनिक्स जैसी प्रणालियों में ऐसा करने का एकमात्र तरीका है। प्रक्रिया के लिए एक अलग प्रोग्राम का निष्पादन प्रारम्भ करने के लिए यह पहले स्वयं की एक प्रति बनाने के लिए फोर्क करता है। कॉपी जिसे चाइल्ड प्रोसेस कहा जाता है, दूसरे प्रोग्राम के साथ स्वयं को ओवरले करने के लिए निष्पादन (सिस्टम कॉल) सिस्टम कॉल को कॉल करती है और यह दूसरे के पक्ष में अपने पूर्व प्रोग्राम का निष्पादन बंद कर देती है।


फोर्क ऑपरेशन बच्चे के लिए एक अलग [[पता स्थान]] बनाता है। चाइल्ड प्रोसेस में [[जनक प्रक्रिया]] के सभी मेमोरी सेगमेंट की सटीक कॉपी होती है। [[SunOS]]-4.0 से [[ आभासी मेमोरी ]] मॉडल का पालन करने वाले आधुनिक UNIX वेरिएंट में, [[लिखने पर नकल]] सिमेंटिक्स लागू किए जाते हैं और भौतिक मेमोरी को वास्तव में कॉपी करने की आवश्यकता नहीं होती है। इसके बजाय, दोनों प्रक्रियाओं में [[वर्चुअल मेमोरी पेज]] भौतिक मेमोरी के समान पेजों को संदर्भित कर सकते हैं जब तक कि उनमें से कोई एक ऐसे पेज पर नहीं लिखता है: तब इसे कॉपी किया जाता है। यह अनुकूलन सामान्य मामले में महत्वपूर्ण है जहां एक नए प्रोग्राम को निष्पादित करने के लिए fork का उपयोग exec के संयोजन के साथ किया जाता है: आम तौर पर, [[बाल प्रक्रिया]] शुरू होने वाले कार्यक्रम के पक्ष में अपने कार्यक्रम के निष्पादन को समाप्त करने से पहले केवल क्रियाओं का एक छोटा सा सेट करती है, और इसके माता-पिता के [[डेटा संरचना]]ओं में से बहुत कम, यदि कोई हो, की आवश्यकता होती है।
फोर्क संगणिकीय संक्रिया चाइल्ड के लिए एक अलग [[पता स्थान|एड्रेस स्पेस]] बनाता है। चाइल्ड प्रोसेस में [[जनक प्रक्रिया|पैरेंट प्रक्रिया]] के सभी मेमोरी सेगमेंट की सटीक कॉपी होती है। [[SunOS|सन ओएस]]-4.0 से [[ आभासी मेमोरी |वर्चुअल मेमोरी]] मॉडल का पालन करने वाले आधुनिक यूनिक्स वेरिएंट में, [[लिखने पर नकल|लिखने पर कॉपी]] सिमेंटिक्स लागू किए जाते हैं और भौतिक मेमोरी को वास्तव में कॉपी करने की आवश्यकता नहीं होती है। इसके स्थान पर, दोनों प्रक्रियाओं में [[वर्चुअल मेमोरी पेज]] भौतिक मेमोरी के समान पेजों को संदर्भित कर सकते हैं जब तक कि उनमें से कोई एक ऐसे पेज पर नहीं लिखता है: तब इसे कॉपी किया जाता है। यह अनुकूलन सामान्य सन्दर्भ में महत्वपूर्ण है जहां एक नए प्रोग्राम को निष्पादित करने के लिए फोर्क का उपयोग निष्पादन के संयोजन के साथ किया जाता है: सामान्यतः, [[बाल प्रक्रिया|चाइल्ड प्रक्रिया]] प्रारम्भ होने वाले प्रोग्राम के पक्ष में अपने प्रोग्राम के निष्पादन को समाप्त करने से पहले केवल क्रियाओं का एक छोटा सा समुच्चय सेट करती है, और इसके पैरेंट के [[डेटा संरचना]]ओं में से बहुत कम प्रोग्राम की आवश्यकता होती है।


जब कोई प्रक्रिया फोर्क कहती है, तो उसे मूल प्रक्रिया माना जाता है और नव निर्मित प्रक्रिया उसका बच्चा है। फोर्क के बाद, दोनों प्रक्रियाएं न केवल एक ही प्रोग्राम चलाती हैं, बल्कि वे निष्पादन फिर से शुरू करती हैं जैसे कि दोनों [[कार्यकारी (सिस्टम कॉल)]] को कॉल किया था। फिर वे अपनी स्थिति, बच्चे या माता-पिता को निर्धारित करने के लिए कॉल के वापसी मूल्य का निरीक्षण कर सकते हैं और तदनुसार कार्य कर सकते हैं।
जब कोई प्रक्रिया फोर्क कहलाती है, तो उसे मूल प्रक्रिया माना जाता है और नव निर्मित प्रक्रिया उसका चाइल्ड है। फोर्क के बाद, दोनों प्रक्रियाएं न केवल एक ही प्रोग्राम चलाती हैं, बल्कि वे निष्पादन फिर से प्रारम्भ करती हैं जैसे कि दोनों [[कार्यकारी (सिस्टम कॉल)]] को कॉल किया था। फिर वे अपनी स्थिति, चाइल्ड या पैरेंट को निर्धारित करने के लिए कॉल के रिटर्न वैल्यू का निरीक्षण कर सकते हैं और तदनुसार कार्य कर सकते हैं।


== इतिहास ==
== इतिहास ==
1962 में प्रकाशित [[मेल्विन कॉनवे]] द्वारा ए मल्टीप्रोसेसर सिस्टम डिज़ाइन में एक कांटा अवधारणा के शुरुआती संदर्भों में से एक दिखाई दिया।<ref>{{Cite journal|title=फोर्क और जॉइन के इतिहास पर नोट्स|last=Nyman|first=Linus|date=25 August 2016|journal=IEEE Annals of the History of Computing|volume=38|issue=3|pages=84–87|doi=10.1109/MAHC.2016.34}}</ref> कॉनवे के पेपर ने [[प्रोजेक्ट जिन्न]]|जेनी टाइम-शेयरिंग सिस्‍टम में फोर्क के एल. पीटर डिस्‍टक्‍यू द्वारा कार्यान्‍वयन को प्रेरित किया, जहां [[केन थॉम्पसन]] द्वारा इसकी शुरूआती उपस्थिति के लिए अवधारणा को उधार लिया गया था।<ref>{{Cite web|url=https://github.com/dspinellis/unix-history-repo/blob/Research-PDP7-Snapshot-Development/s3.s#L43-L70|title=s3.s from Research UNIX|date=1970|website=GitHub}}</ref> [[ अनुसंधान यूनिक्स ]] में।<ref>{{cite encyclopedia|title=एसवाईएस फोर्क (द्वितीय)|encyclopedia=UNIX Programmer's Manual|publisher=[[Bell Labs|Bell Laboratories]]|url=https://www.bell-labs.com/usr/dmr/www/pdfs/man21.pdf|date=3 November 1971|author=[[Ken Thompson]] and [[Dennis Ritchie]]}}</ref><ref name="Ritchie">{{cite journal|last1=Ritchie|first1=Dennis M.|last2=Thompson|first2=Ken|date=July 1978|title=UNIX टाइम-शेयरिंग सिस्टम|url=https://www.bell-labs.com/usr/dmr/www/cacm.pdf|journal=Bell System Tech. J.|publisher=AT&T|volume=57|issue=6|pages=1905–1929|doi=10.1002/j.1538-7305.1978.tb02136.x|access-date=22 April 2014|authorlink1=Dennis Ritchie}}</ref> Fork बाद में POSIX में एक मानक इंटरफ़ेस बन गया।<ref name="posix">{{man|sh|fork}}</ref>
1962 में प्रकाशित [[मेल्विन कॉनवे]] द्वारा ए मल्टीप्रोसेसर सिस्टम डिज़ाइन में एक फोर्क अवधारणा के प्रारम्भिक संदर्भों में से एक दिखाई दिया।<ref>{{Cite journal|title=फोर्क और जॉइन के इतिहास पर नोट्स|last=Nyman|first=Linus|date=25 August 2016|journal=IEEE Annals of the History of Computing|volume=38|issue=3|pages=84–87|doi=10.1109/MAHC.2016.34}}</ref> कॉनवे के पेपर ने [[प्रोजेक्ट जिन्न]] टाइम-शेयरिंग सिस्‍टम में फोर्क के एल. पीटर डिस्‍टक्‍यू द्वारा कार्यान्‍वयन को प्रेरित किया, जहां [[केन थॉम्पसन]] द्वारा इसका प्रारम्भ विशेष उपस्थिति के लिए अवधारणा को उधार लिया गया था।<ref>{{Cite web|url=https://github.com/dspinellis/unix-history-repo/blob/Research-PDP7-Snapshot-Development/s3.s#L43-L70|title=s3.s from Research UNIX|date=1970|website=GitHub}}</ref> [[ अनुसंधान यूनिक्स |अनुसंधान यूनिक्स]] में<ref>{{cite encyclopedia|title=एसवाईएस फोर्क (द्वितीय)|encyclopedia=UNIX Programmer's Manual|publisher=[[Bell Labs|Bell Laboratories]]|url=https://www.bell-labs.com/usr/dmr/www/pdfs/man21.pdf|date=3 November 1971|author=[[Ken Thompson]] and [[Dennis Ritchie]]}}</ref><ref name="Ritchie">{{cite journal|last1=Ritchie|first1=Dennis M.|last2=Thompson|first2=Ken|date=July 1978|title=UNIX टाइम-शेयरिंग सिस्टम|url=https://www.bell-labs.com/usr/dmr/www/cacm.pdf|journal=Bell System Tech. J.|publisher=AT&T|volume=57|issue=6|pages=1905–1929|doi=10.1002/j.1538-7305.1978.tb02136.x|access-date=22 April 2014|authorlink1=Dennis Ritchie}}</ref> फोर्क बाद में पॉज़िक्स में एक मानक इंटरफ़ेस बन गया।<ref name="posix">{{man|sh|fork}}</ref>




== संचार ==
== संचार ==
चाइल्ड प्रक्रिया अपने माता-पिता के [[फाइल डिस्क्रिप्टर]] की एक प्रति के साथ शुरू होती है।{{r|posix}} इंटरप्रोसेस कम्युनिकेशन के लिए, मूल प्रक्रिया अक्सर एक या कई [[ पाइप (कंप्यूटर विज्ञान) ]] बनाती है, और फिर फोर्किंग के बाद प्रक्रियाएं उन पाइपों के सिरों को बंद कर देंगी जिनकी उन्हें आवश्यकता नहीं है।<ref>{{man|sh|pipe}}</ref>
चाइल्ड प्रक्रिया अपने पैरेंट के [[फाइल डिस्क्रिप्टर]] की एक प्रति के साथ प्रारम्भ होती है।{{r|posix}} इंटरप्रोसेस कम्युनिकेशन के लिए, मूल प्रक्रिया प्रायः एक या कई [[ पाइप (कंप्यूटर विज्ञान) |पाइप (कंप्यूटर विज्ञान)]] बनाती है, और फिर फोर्किंग के बाद प्रक्रियाएं उन पाइपों के सिरों को बंद कर देंगी जिनकी उन्हें आवश्यकता नहीं है।<ref>{{man|sh|pipe}}</ref>




== वेरिएंट ==
== वेरिएंट ==


=== वीफोर्क ===
=== वी फोर्क ===
Vfork समान [[कॉलिंग कन्वेंशन]] और समान शब्दार्थ के साथ fork का एक प्रकार है, लेकिन केवल प्रतिबंधित स्थितियों में उपयोग किया जाता है। यह यूनिक्स के [[ बर्कले सॉफ्टवेयर वितरण ]] संस्करण में उत्पन्न हुआ,<ref name= man|2|vfork|Linux>{{man|2|vfork|Linux}}</ref>{{r|netbsd-vfork}}<ref>{{cite encyclopedia |title=vfork(2) |encyclopedia=UNIX Programmer's Manual, Virtual VAX-11 Version |publisher=University of California, Berkeley |date=December 1979}}</ref> वर्चुअल मेमोरी का समर्थन करने वाला पहला यूनिक्स। इसे POSIX द्वारा मानकीकृत किया गया था, जिसने vfork को फोर्क के समान ही व्यवहार करने की अनुमति दी थी, लेकिन 2004 के संस्करण में अप्रचलित चिह्नित किया गया था।<ref name="posix-vfork">{{man|sh|vfork|SUS6}}</ref> और बाद के संस्करणों में स्पॉन (कंप्यूटिंग) #POSIX स्पॉन फ़ंक्शंस|posix_spawn() (जो आमतौर पर vfork के माध्यम से कार्यान्वित किया जाता है) द्वारा प्रतिस्थापित किया गया था।
वी फोर्क समान [[कॉलिंग कन्वेंशन]] और समान शब्दार्थ के साथ फोर्क का एक प्रकार है, लेकिन इसे केवल प्रतिबंधित स्थितियों में उपयोग किया जाता है। यह यूनिक्स के [[ बर्कले सॉफ्टवेयर वितरण |बर्कले सॉफ्टवेयर वितरण]] संस्करण वर्चुअल मेमोरी का समर्थन करने वाले पहले यूनिक्स में उत्पन्न हुआ<ref name= man|2|vfork|Linux>{{man|2|vfork|Linux}}</ref>{{r|netbsd-vfork}}<ref>{{cite encyclopedia |title=vfork(2) |encyclopedia=UNIX Programmer's Manual, Virtual VAX-11 Version |publisher=University of California, Berkeley |date=December 1979}}</ref>इसे पॉज़िक्स द्वारा मानकीकृत किया गया था, जिसने वी फोर्क को फोर्क के समान ही व्यवहार करने की अनुमति दी थी, लेकिन 2004 के संस्करण में इसे अप्रचलित चिह्नित किया गया था।<ref name="posix-vfork">{{man|sh|vfork|SUS6}}</ref> और बाद के संस्करणों में स्पॉन (कंप्यूटिंग) पॉज़िक्स स्पॉन फ़ंक्शंस (जो सामान्यतः वी फोर्क के माध्यम से कार्यान्वित किया जाता है) द्वारा प्रतिस्थापित किया गया था।


जब एक vfork सिस्टम कॉल जारी किया जाता है, तो मूल प्रक्रिया को तब तक निलंबित कर दिया जाएगा जब तक कि बच्चे की प्रक्रिया या तो निष्पादन पूरा नहीं कर लेती है या सिस्टम कॉल के निष्पादन (कंप्यूटिंग) परिवार में से एक के माध्यम से एक नई निष्पादन योग्य छवि के साथ बदल दी जाती है। बच्चा माता-पिता से [[स्मृति प्रबंधन इकाई]] सेटअप उधार लेता है और स्मृति पृष्ठों को माता-पिता और बच्चे की प्रक्रिया के बीच बिना किसी प्रतिलिपि के साझा किया जाता है, और विशेष रूप से कोई कॉपी-ऑन-राइट शब्दार्थ नहीं होता है;<ref name="posix-vfork"/>इसलिए, यदि चाइल्ड प्रोसेस किसी भी शेयर किए गए पेज में संशोधन करता है, तो कोई नया पेज नहीं बनाया जाएगा और संशोधित पेज पेरेंट प्रोसेस को भी दिखाई देंगे। चूँकि इसमें कोई पृष्ठ प्रतिलिपि शामिल नहीं है (अतिरिक्त मेमोरी का उपभोग), यह तकनीक पूर्ण-प्रतिलिपि वातावरण में सादे फोर्क पर एक अनुकूलन है जब निष्पादन के साथ प्रयोग किया जाता है। POSIX में, किसी भी उद्देश्य के लिए vfork का उपयोग निष्पादन परिवार (और कुछ अन्य चुनिंदा कार्यों) से किसी फ़ंक्शन को तत्काल कॉल करने के लिए छोड़कर [[अपरिभाषित व्यवहार]] को जन्म देता है।<ref name="posix-vfork"/>Vfork की तरह, बच्चा डेटा संरचनाओं को कॉपी करने के बजाय उन्हें उधार लेता है। vfork अभी भी एक फोर्क से तेज है जो कॉपी ऑन राइट शब्दार्थ का उपयोग करता है।
जब एक वी फोर्क सिस्टम कॉल जारी किया जाता है, तो मूल प्रक्रिया को तब तक निलंबित कर दिया जाएगा जब तक कि चाइल्ड की प्रक्रिया या तो निष्पादन पूरा नहीं कर लेती है या सिस्टम कॉल के निष्पादन (कंप्यूटिंग) समुदाय में से एक के माध्यम से एक नई निष्पादन योग्य छवि के साथ बदल दी जाती है। चाइल्ड पैरेंट से [[स्मृति प्रबंधन इकाई]] सेटअप उधार लेता है और स्मृति पृष्ठों को पैरेंट और चाइल्ड की प्रक्रिया के बीच बिना किसी प्रतिलिपि के साझा किया जाता है, और विशेष रूप से कोई कॉपी-ऑन-राइट शब्दार्थ नहीं होता है;<ref name="posix-vfork"/>इसलिए, यदि चाइल्ड प्रोसेस किसी भी शेयर किए गए पेज में संशोधन करता है, तो कोई नया पेज नहीं बनाया जाएगा और संशोधित पेज पेरेंट प्रोसेस को भी दिखाई देंगे। चूँकि इसमें कोई पृष्ठ प्रतिलिपि सम्मिलित नहीं है (अतिरिक्त मेमोरी का उपभोग), यह तकनीक पूर्ण-प्रतिलिपि वातावरण में सादे फोर्क पर एक अनुकूलन है जो कि निष्पादन के साथ प्रयोग किया जाता है। पॉज़िक्स में, किसी भी उद्देश्य के लिए वी फोर्क का उपयोग निष्पादन समुदाय (और कुछ अन्य चुनिंदा कार्यों) से किसी फ़ंक्शन को तत्काल कॉल करने के लिए छोड़कर [[अपरिभाषित व्यवहार]] को उत्पन्न करता है।<ref name="posix-vfork"/>वी फोर्क की तरह, चाइल्ड डेटा संरचनाओं को कॉपी करने के स्थान पर उन्हें उधार लेता है। वी फोर्क अभी भी एक फोर्क से तेज है जो कॉपी ऑन राइट शब्दार्थ का उपयोग करता है।


[[ यूनिक्स प्रणाली वी ]]ने सिस्टम वीआर 4 पेश करने से पहले इस फ़ंक्शन कॉल का समर्थन नहीं किया था,{{citation needed|date=May 2015}} क्योंकि इसके कारण होने वाली स्मृति साझाकरण त्रुटि-प्रवण है:
[[ यूनिक्स प्रणाली वी | यूनिक्स प्रणाली वी]] ने सिस्टम वीआर 4 प्रस्तुत करने से पहले इस फ़ंक्शन कॉल का समर्थन नहीं किया था,{{citation needed|date=May 2015}} क्योंकि इसके कारण होने वाली स्मृति साझाकरण त्रुटि-प्रवण है:


{{quote|''Vfork'' does not copy page tables so it is faster than the System V ''fork'' implementation. But the child process executes in the same physical address space as the parent process (until an ''exec'' or ''exit'') and can thus overwrite the parent's data and stack. A dangerous situation could arise if a programmer uses ''vfork'' incorrectly, so the onus for calling ''vfork'' lies with the programmer. The difference between the System V approach and the BSD approach is philosophical: Should the kernel hide idiosyncrasies of its implementation from users, or should it allow sophisticated users the opportunity to take advantage of the implementation to do a logical function more efficiently?|Maurice J. Bach<ref>{{Cite book |title=The Design of The UNIX Operating System |first=Maurice J. |last=Bach |publisher=Prentice–Hall |year=1986 |pages=291–292|bibcode=1986duos.book.....B }}</ref>}}
{{quote|''वी फोर्क'' पेज टेबल को कॉपी नहीं करता है, इसलिए यह सिस्टम "वी फोर्क" कार्यान्वयन से तेज है। लेकिन चाइल्ड प्रोसेस उसी फिजिकल एड्रेस स्पेस में पेरेंट प्रोसेस के रूप में निष्पादित होता है (''exec'' या ''exit'' तक) और इस प्रकार पैरेंट के डेटा और स्टैक को ओवरराइट कर सकता है। अगर कोई प्रोग्रामर ''वी फोर्क'' का गलत उपयोग करता है तो एक खतरनाक स्थिति उत्पन्न हो सकती है, इसलिए ''वी फोर्क'' को कॉल करने की जिम्मेदारी प्रोग्रामर की होती है। सिस्टम वी दृष्टिकोण और बीएसडी दृष्टिकोण के बीच का अंतर दार्शनिक है: क्या कर्नेल को उपयोगकर्ताओं से इसके कार्यान्वयन के स्वभाव को छिपाना चाहिए, या क्या इसे परिष्कृत उपयोगकर्ताओं को तार्किक कार्य को अधिक कुशलता से करने के लिए कार्यान्वयन का लाभ उठाने का अवसर देना चाहिए?|मौरिस जे. बौच<ref>{{Cite book |title=The Design of The UNIX Operating System |first=Maurice J. |last=Bach |publisher=Prentice–Hall |year=1986 |pages=291–292|bibcode=1986duos.book.....B }}</ref>}}


इसी तरह, vfork के लिए Linux मैन पेज दृढ़ता से इसके उपयोग को हतोत्साहित करता है:<ref name= man|2|vfork|Linux />{{Failed verification|date=November 2019|reason=quote not in source}}{{discuss|unfortunate, etc}}
इसी तरह, वी फोर्क के लिए लाइनक्स मैन पेज दृढ़ता से इसके उपयोग को हतोत्साहित करता है:<ref name= man|2|vfork|Linux />{{Failed verification|date=November 2019|reason=quote not in source}}{{discuss|unfortunate, etc}}
{{quote|It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are  implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."}}
{{quote|यह दुर्भाग्य की बात है कि लिनक्स ने इस स्पेक्टर को अतीत से पुनर्जीवित किया। बीएसडी मैन पेज बताता है: "उचित सिस्टम साझाकरण तंत्र लागू होने पर यह सिस्टम कॉल समाप्त हो जाएगा। उपयोगकर्ताओं को वी फोर्क() की मेमोरी शेयरिंग सेमेन्टिक्स पर निर्भर नहीं होना चाहिए क्योंकि यह उस स्थिति में यह फोर्क (2) का पर्याय बन जाएगा। "}}


साथ अन्य समस्याएं {{mono|vfork}} [[गतिशील लिंकिंग]] के साथ इंटरेक्शन के कारण बहु-थ्रेडेड प्रोग्राम में उत्पन्न होने वाले [[गतिरोध]] शामिल हैं।{{r|oracle}} के प्रतिस्थापन के रूप में {{mono|vfork}} इंटरफ़ेस, POSIX ने पेश किया {{mono|posix_spawn}} कार्यों का परिवार जो फोर्क और निष्पादन के कार्यों को जोड़ता है। इन कार्यों को पुस्तकालय दिनचर्या के रूप में लागू किया जा सकता है {{mono|fork}}, जैसा Linux में किया जाता है,{{r|oracle}} या के संदर्भ में {{mono|vfork}} बेहतर प्रदर्शन के लिए, जैसा सोलारिस में किया जाता है,<ref name="oracle">{{cite web |last=Nakhimovsky |first=Greg |date=May 2006 |title=एप्लिकेशन सबप्रोसेस बनाने के लिए मेमोरी उपयोग को कम करना|url=http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html |archive-url=https://web.archive.org/web/20190922113430/https://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html |archive-date=Sep 22, 2019 |website=Oracle Technology Network |publisher=[[Oracle Corporation]]}}</ref><ref>[[sourceforge:p/schillix-on/schillix-on/ci/default/tree/usr/src/lib/libc/port/threads/spawn.c|The OpenSolaris posix_spawn() implementation]]</ref> लेकिन POSIX विनिर्देश नोट करता है कि उन्हें सिस्टम कॉल के रूप में डिज़ाइन किया गया था, विशेष रूप से विवश हार्डवेयर और [[रीयल-टाइम कंप्यूटिंग]] | रीयल-टाइम सिस्टम पर चलने वाले ऑपरेटिंग सिस्टम के लिए।<ref>{{man|sh|posix_spawn|SUS}}</ref>
इसके साथ अन्य समस्याएं {{mono|vfork}} [[गतिशील लिंकिंग]] के साथ इंटरेक्शन के कारण मल्टी-थ्रेडेड प्रोग्राम में उत्पन्न होने वाले [[गतिरोध]] सम्मिलित हैं।{{r|oracle}}मल्टी-थ्रेडेड के प्रतिस्थापन के रूप में {{mono|vfork}} इंटरफ़ेस, पॉज़िक्स ने प्रस्तुत {{mono|posix_spawn}} कार्यों का समुदाय जो फोर्क और निष्पादन के कार्यों को जोड़ता है। इन कार्यों को लाइब्रेरी {{mono|fork}} दिनचर्या के रूप में लागू किया जा सकता है, जैसा लाइनक्स में किया जाता है,{{r|oracle}} या के संदर्भ में {{mono|vfork}} बेहतर प्रदर्शन के लिए, जैसा सोलारिस में किया जाता है,<ref name="oracle">{{cite web |last=Nakhimovsky |first=Greg |date=May 2006 |title=एप्लिकेशन सबप्रोसेस बनाने के लिए मेमोरी उपयोग को कम करना|url=http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html |archive-url=https://web.archive.org/web/20190922113430/https://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html |archive-date=Sep 22, 2019 |website=Oracle Technology Network |publisher=[[Oracle Corporation]]}}</ref><ref>[[sourceforge:p/schillix-on/schillix-on/ci/default/tree/usr/src/lib/libc/port/threads/spawn.c|The OpenSolaris posix_spawn() implementation]]</ref> लेकिन पॉज़िक्स विनिर्देश नोट करता है कि उन्हें सिस्टम कॉल के रूप में डिज़ाइन किया गया था, विशेष रूप से विवश हार्डवेयर और [[रीयल-टाइम कंप्यूटिंग]] रीयल-टाइम सिस्टम पर चलने वाले ऑपरेटिंग सिस्टम के लिए कार्यों को जोड़ता है।<ref>{{man|sh|posix_spawn|SUS}}</ref> जबकि 4.4बीएसडी कार्यान्वयन ने वी फोर्क कार्यान्वयन से छुटकारा पा लिया, जिससे वी फोर्क का व्यवहार फोर्क के समान हो गया, इसे बाद में प्रदर्शन कारणों से [[NetBSD|नेटबीएसडी]] ऑपरेटिंग सिस्टम में बहाल कर दिया गया।<ref name="netbsd-vfork">{{cite web |title=NetBSD Documentation: Why implement traditional vfork() |website=NetBSD Project |access-date=16 October 2013 |url=http://www.netbsd.org/docs/kernel/vfork.html}}</ref> कुछ एम्बेडेड ऑपरेटिंग सिस्टम जैसे कि [[uClinux|यूसीलाइनक्स]] फोर्क को छोड़ देते हैं और केवल वी फोर्क को लागू करते हैं, क्योंकि उन्हें उन उपकरणों पर काम करने की आवश्यकता होती है जहां मेमोरी मैनेजमेंट यूनिट की कमी के कारण कॉपी-ऑन-राइट लागू करना असंभव है।
जबकि 4.4BSD कार्यान्वयन ने vfork कार्यान्वयन से छुटकारा पा लिया, जिससे vfork का व्यवहार fork के समान हो गया, इसे बाद में प्रदर्शन कारणों से [[NetBSD]] ऑपरेटिंग सिस्टम में बहाल कर दिया गया।<ref name="netbsd-vfork">{{cite web |title=NetBSD Documentation: Why implement traditional vfork() |website=NetBSD Project |access-date=16 October 2013 |url=http://www.netbsd.org/docs/kernel/vfork.html}}</ref>
कुछ एम्बेडेड ऑपरेटिंग सिस्टम जैसे कि [[uClinux]] फोर्क को छोड़ देते हैं और केवल vfork को लागू करते हैं, क्योंकि उन्हें उन उपकरणों पर काम करने की आवश्यकता होती है जहां मेमोरी मैनेजमेंट यूनिट की कमी के कारण कॉपी-ऑन-राइट लागू करना असंभव है।


=== रफर्क ===
=== आरफोर्क ===
यूनिक्स के डिजाइनरों द्वारा बनाई गई बेल लैब्स ऑपरेटिंग सिस्टम की योजना 9 में फोर्क शामिल है, लेकिन rfork नामक एक संस्करण भी है, जो पता स्थान सहित माता-पिता और बच्चे की प्रक्रियाओं के बीच संसाधनों के ठीक-ठाक साझा करने की अनुमति देता है ([[कॉल स्टैक]] सेगमेंट को छोड़कर, जो प्रत्येक प्रक्रिया के लिए अद्वितीय है), पर्यावरण चर और फाइलसिस्टम नेमस्पेस;<ref>{{man|2|fork|Plan 9}}</ref> यह इसे प्रक्रियाओं और उनके भीतर थ्रेड (कंप्यूटर विज्ञान) दोनों के निर्माण के लिए एक एकीकृत इंटरफ़ेस बनाता है।<ref>{{man|2|intro|Plan 9}}</ref> फ्रीबीएसडी दोनों<ref>{{man|2|rfork|FreeBSD}}</ref> और [[IRIX]] ने योजना 9 से rfork सिस्टम कॉल को अपनाया, बाद वाले ने इसे sproc नाम दिया।{{r|opensources}}
यूनिक्स के डिजाइनरों द्वारा बनाई गई बेल लैब्स ऑपरेटिंग सिस्टम की योजना 9 में फोर्क सम्मिलित है, लेकिन आरफोर्क नामक एक संस्करण भी है, जो एड्रेस स्पेस सहित पैरेंट और चाइल्ड की प्रक्रियाओं के बीच संसाधनों के ठीक-ठाक साझा करने की अनुमति देता है ([[कॉल स्टैक]] सेगमेंट को छोड़कर, जो प्रत्येक प्रक्रिया के लिए अद्वितीय है), पर्यावरण चर और फाइलसिस्टम नेमस्पेस;<ref>{{man|2|fork|Plan 9}}</ref> यह इसे प्रक्रियाओं और उनके भीतर थ्रेड (कंप्यूटर विज्ञान) दोनों के निर्माण के लिए एक एकीकृत इंटरफ़ेस बनाता है।<ref>{{man|2|intro|Plan 9}}</ref> फ्रीबीएसडी दोनों<ref>{{man|2|rfork|FreeBSD}}</ref> और [[IRIX|आईआरआईएक्स]] ने योजना 9 से आर फोर्क सिस्टम कॉल को अपनाया, बाद में इसे स्प्रॉक नाम दिया गया।{{r|opensources}}


{{anchor|Linux_clone_syscall}}
{{anchor|Linux_clone_syscall}}


=== क्लोन ===
=== क्लोन ===
<code>clone</code> [[लिनक्स कर्नेल]] में एक सिस्टम कॉल है जो एक चाइल्ड प्रोसेस बनाता है जो अपने निष्पादन [[संदर्भ (कंप्यूटिंग)]] के कुछ हिस्सों को माता-पिता के साथ साझा कर सकता है। FreeBSD के rfork और IRIX के स्पोक की तरह, Linux का क्लोन प्लान 9 के rfork से प्रेरित था और इसका उपयोग थ्रेड्स को लागू करने के लिए किया जा सकता है (हालाँकि एप्लिकेशन प्रोग्रामर आमतौर पर उच्च-स्तरीय इंटरफ़ेस जैसे [[pthreads]], क्लोन के शीर्ष पर कार्यान्वित) का उपयोग करेंगे। प्लान 9 और आईआरआईएक्स से अलग स्टैक सुविधा को छोड़ दिया गया है क्योंकि ([[लिनस टोरवाल्ड्स]] के अनुसार) यह बहुत अधिक ओवरहेड का कारण बनता है।<ref name="opensources">{{cite encyclopedia |title=लिनक्स का किनारा|first=Linus |last=Torvalds |encyclopedia=Open Sources: Voices from the Open Source Revolution |year=1999 |publisher=O'Reilly |url=https://archive.org/details/isbn_9781565925823 |isbn=978-1-56592-582-3 |url-access=registration }}</ref>
<code>clone</code> [[लिनक्स कर्नेल]] में एक सिस्टम कॉल है जो एक चाइल्ड प्रोसेस बनाता है जो अपने निष्पादन [[संदर्भ (कंप्यूटिंग)]] के कुछ हिस्सों को पैरेंट के साथ साझा कर सकता है। फ्रीबीएसडी के आर फोर्क और आईआरआईएक्स के स्पोक की तरह, लाइनक्स का क्लोन प्लान 9 के आर फोर्क से प्रेरित था और इसका उपयोग थ्रेड्स को लागू करने के लिए किया जा सकता है (हालाँकि एप्लिकेशन प्रोग्रामर सामान्यतः उच्च-स्तरीय इंटरफ़ेस जैसे [[pthreads|पथ्रेडस]], क्लोन के शीर्ष पर कार्यान्वित) का उपयोग करेंगे। प्लान 9 और आईआरआईएक्स से अलग स्टैक सुविधा को छोड़ दिया गया है क्योंकि ([[लिनस टोरवाल्ड्स]] के अनुसार) यह बहुत अधिक ओवरहेड का कारण बनता है।<ref name="opensources">{{cite encyclopedia |title=लिनक्स का किनारा|first=Linus |last=Torvalds |encyclopedia=Open Sources: Voices from the Open Source Revolution |year=1999 |publisher=O'Reilly |url=https://archive.org/details/isbn_9781565925823 |isbn=978-1-56592-582-3 |url-access=registration }}</ref>




== अन्य ऑपरेटिंग सिस्टम में फोर्किंग ==
== अन्य ऑपरेटिंग सिस्टम में फोर्किंग ==
{{one source|section|date= February 2015}}
[[OpenVMS|ओपन वीएमएस]] ऑपरेटिंग सिस्टम (1977) के मूल डिजाइन में, फोर्किंग के रूप में नई प्रक्रिया के लिए कुछ विशिष्ट पतों की सामग्री के बाद के उत्परिवर्तन के साथ एक कॉपी संगणिकीय संक्रिया को जोखिम भरा माना जाता था।{{citation needed|date=October 2013}} वर्तमान प्रक्रिया स्थिति में त्रुटियां चाइल्ड प्रक्रिया में कॉपी की जा सकती हैं। यहां, प्रक्रिया स्पॉनिंग के रूपक का उपयोग किया जाता है: नई प्रक्रिया के मेमोरी लेआउट के प्रत्येक घटक को खरोंच से नवनिर्मित किया जाता है। [[स्पॉन (कंप्यूटिंग)]] रूपक को बाद में माइक्रोसॉफ्ट ऑपरेटिंग सिस्टम (1993) में अपनाया गया।
[[OpenVMS]] ऑपरेटिंग सिस्टम (1977) के मूल डिजाइन में, फोर्किंग के रूप में नई प्रक्रिया के लिए कुछ विशिष्ट पतों की सामग्री के बाद के उत्परिवर्तन के साथ एक कॉपी ऑपरेशन को जोखिम भरा माना जाता था।{{citation needed|date=October 2013}} वर्तमान प्रक्रिया स्थिति में त्रुटियां चाइल्ड प्रक्रिया में कॉपी की जा सकती हैं। यहां, प्रक्रिया स्पॉनिंग के रूपक का उपयोग किया जाता है: नई प्रक्रिया के मेमोरी लेआउट के प्रत्येक घटक को खरोंच से नवनिर्मित किया जाता है। [[स्पॉन (कंप्यूटिंग)]] रूपक को बाद में माइक्रोसॉफ्ट ऑपरेटिंग सिस्टम (1993) में अपनाया गया।


वीएम/सीएमएस (ओपनएक्सटेंशन) का पॉज़िक्स-संगतता घटक फोर्क का एक बहुत ही सीमित कार्यान्वयन प्रदान करता है, जिसमें बच्चे को निष्पादित करते समय माता-पिता को निलंबित कर दिया जाता है, और बच्चे और माता-पिता एक ही पता स्थान साझा करते हैं।<ref>{{cite web|url=http://www-01.ibm.com/support/knowledgecenter/SSB27U_6.2.0/com.ibm.zvm.v620.dmsp0/hcsp0c0022.htm%23wq47?lang=en|title=z/VM > z/VM 6.2.0 > Application Programming > z/VM V6R2 OpenExtensions POSIX Conformance Document > POSIX.1 Conformance Document > Section 3. Process Primitives > 3.1 Process Creation and Execution > 3.1.1 Process Creation
वीएम/सीएमएस (ओपनएक्सटेंशन) का पॉज़िक्स-संगतता घटक फोर्क का एक बहुत ही सीमित कार्यान्वयन प्रदान करता है, जिसमें चाइल्ड को निष्पादित करते समय पैरेंट को निलंबित कर दिया जाता है, और चाइल्ड और पैरेंट एक ही एड्रेस स्पेस साझा करते हैं।<ref>{{cite web|url=http://www-01.ibm.com/support/knowledgecenter/SSB27U_6.2.0/com.ibm.zvm.v620.dmsp0/hcsp0c0022.htm%23wq47?lang=en|title=z/VM > z/VM 6.2.0 > Application Programming > z/VM V6R2 OpenExtensions POSIX Conformance Document > POSIX.1 Conformance Document > Section 3. Process Primitives > 3.1 Process Creation and Execution > 3.1.1 Process Creation
|publisher=IBM|access-date=April 21, 2015}}</ref> यह अनिवार्य रूप से एक फोर्क के रूप में लेबल किया गया एक vfork है। (यह केवल CMS अतिथि ऑपरेटिंग सिस्टम पर लागू होता है; अन्य VM अतिथि ऑपरेटिंग सिस्टम, जैसे Linux, मानक फ़ोर्क कार्यक्षमता प्रदान करते हैं।)
|publisher=IBM|access-date=April 21, 2015}}</ref> यह अनिवार्य रूप से एक फोर्क के रूप में लेबल किया गया एक वी फोर्क है। (यह केवल सीएमएस गेस्ट ऑपरेटिंग सिस्टम पर लागू होता है; अन्य वीएम गेस्ट ऑपरेटिंग सिस्टम, जैसे लाइनक्स, मानक फ़ोर्क कार्यक्षमता प्रदान करते हैं।)


== आवेदन उपयोग ==
== आवेदन उपयोग ==


हेलो, वर्ल्ड! का निम्न संस्करण! कार्यक्रम यांत्रिकी को प्रदर्शित करता है {{mono|fork}} [[सी (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा में सिस्टम कॉल। कार्यक्रम दो प्रक्रियाओं में बंट जाता है, प्रत्येक यह तय करता है कि फोर्क सिस्टम कॉल के रिटर्न वैल्यू के आधार पर वे किस कार्यक्षमता का प्रदर्शन करते हैं। [[हेडर फाइल]] जैसे [[बॉयलरप्लेट कोड]] को छोड़ दिया गया है।
हेलो, वर्ल्ड! का निम्न संस्करण! प्रोग्राम यांत्रिकी को प्रदर्शित करता है, {{mono|fork}} [[सी (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा में सिस्टम कॉल प्रोग्राम दो प्रक्रियाओं में बंट जाता है, प्रत्येक यह तय करता है कि फोर्क सिस्टम कॉल के रिटर्न वैल्यू के आधार पर वे किस कार्यक्षमता का प्रदर्शन करते हैं। [[हेडर फाइल]] जैसे [[बॉयलरप्लेट कोड]] को छोड़ दिया गया है।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 76: Line 73:
}
}
</syntaxhighlight>
</syntaxhighlight>
इस प्रकार इस कार्यक्रम का एक विच्छेदन है।
इस प्रकार इस प्रोग्राम का एक विच्छेदन है।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
   pid_t pid = fork();
   pid_t pid = fork();
</syntaxhighlight>
</syntaxhighlight>
में पहला बयान {{mono|main}} कॉल करता है {{mono|fork}} निष्पादन को दो प्रक्रियाओं में विभाजित करने के लिए सिस्टम कॉल। का वापसी मूल्य {{mono|fork}} प्रकार के एक चर में दर्ज किया गया है {{mono|pid_t}}, जो प्रक्रिया पहचानकर्ताओं (PIDs) के लिए POSIX प्रकार है।
में पहला स्टेटमेंट {{mono|main}} कॉल करता है, {{mono|fork}} निष्पादन को दो प्रक्रियाओं में विभाजित करने के लिए सिस्टम कॉल का रिटर्न वैल्यू {{mono|fork}} प्रकार के एक चर में दर्ज किया गया है, {{mono|pid_t}}, जो प्रक्रिया पहचानकर्ताओं (पीआईडी) के लिए पॉज़िक्स प्रकार है।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 89: Line 86:
     }
     }
</syntaxhighlight>
</syntaxhighlight>
माइनस वन एक त्रुटि को इंगित करता है {{mono|fork}}: कोई नई प्रक्रिया नहीं बनाई गई थी, इसलिए एक त्रुटि संदेश छपा है।
माइनस वन एक त्रुटि को इंगित करता है, {{mono|fork}}: कोई नई प्रक्रिया नहीं बनाई गई थी, इसलिए एक त्रुटि संदेश प्रिंट हुआ है।


अगर {{mono|fork}} सफल रहा, तो अब दो प्रक्रियाएँ हैं, दोनों क्रियान्वित कर रही हैं {{mono|main}} उस बिंदु से कार्य करें जहां {{mono|fork}} लौट आया। प्रक्रियाओं को अलग-अलग कार्य करने के लिए, प्रोग्राम को रिटर्न वैल्यू पर [[ब्रांच (कंप्यूटर साइंस)]] करना चाहिए {{mono|fork}} यह निर्धारित करने के लिए कि क्या यह चाइल्ड प्रोसेस या पैरेंट प्रोसेस के रूप में निष्पादित हो रहा है।
अगर {{mono|fork}} सफल रहा, तो अब दो प्रक्रियाएँ हैं, दोनों {{mono|main}} क्रियान्वित कर रही हैं, {{mono|main}} उस बिंदु से कार्य करें जहां {{mono|fork}} रिटर्न हुआ। प्रक्रियाओं को अलग-अलग कार्य करने के लिए, प्रोग्राम को रिटर्न वैल्यू पर [[ब्रांच (कंप्यूटर साइंस)]] करना चाहिए, {{mono|fork}} यह निर्धारित करने के लिए कि क्या यह चाइल्ड प्रोसेस या पैरेंट प्रोसेस के रूप में निष्पादित हो रहा है।


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 99: Line 96:
   }
   }
</syntaxhighlight>
</syntaxhighlight>
बाल प्रक्रिया में, वापसी मान शून्य के रूप में प्रकट होता है (जो एक अमान्य प्रक्रिया पहचानकर्ता है)। बाल प्रक्रिया वांछित ग्रीटिंग संदेश प्रिंट करती है, फिर बाहर निकलती है। (तकनीकी कारणों से, POSIX {{mono|_exit}सी मानक के बजाय यहां } फ़ंक्शन का उपयोग किया जाना चाहिए {{mono|exit}} समारोह।)
<nowiki>चाइल्ड प्रक्रिया में, वापसी मान शून्य के रूप में प्रकट होता है (जो एक अमान्य प्रक्रिया पहचानकर्ता है)। चाइल्ड प्रक्रिया वांछित ग्रीटिंग संदेश प्रिंट करती है, फिर बाहर निकलती है। (तकनीकी कारणों से, पॉज़िक्स {{mono|_exit}सी मानक के स्थान पर} यहां फ़ंक्शन </nowiki>{{mono|exit}} का उपयोग किया जाना चाहिए।)


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 107: Line 104:
   }
   }
</syntaxhighlight>
</syntaxhighlight>
दूसरी प्रक्रिया, माता-पिता, से प्राप्त करता है {{mono|fork}} बच्चे की प्रक्रिया पहचानकर्ता, जो हमेशा एक सकारात्मक संख्या होती है। मूल प्रक्रिया इस पहचानकर्ता को पास करती है {{mono|waitpid}} बच्चे के बाहर निकलने तक निष्पादन को निलंबित करने के लिए सिस्टम कॉल। जब ऐसा हो जाता है, तो माता-पिता निष्पादन फिर से शुरू करते हैं और इसके माध्यम से बाहर निकल जाते हैं {{mono|return}} कथन।
दूसरी प्रक्रिया पैरेंट से प्राप्त करता है, {{mono|fork}} चाइल्ड की प्रक्रिया पहचानकर्ता, जो सदैव एक सकारात्मक संख्या होती है। मूल प्रक्रिया इस पहचानकर्ता को पास करती है, {{mono|waitpid}} चाइल्ड के बाहर निकलने तक निष्पादन को निलंबित करने के लिए सिस्टम कॉल को पास करती है। जब ऐसा हो जाता है, तो पैरेंट निष्पादन फिर से प्रारम्भ करते हैं और इसके माध्यम से {{mono|return}} स्टेटमेंट द्वारा बाहर निकल जाते हैं।


== यह भी देखें ==
== यह भी देखें ==
* [[कांटा बम]]
* [[कांटा बम|फोर्क बम]]
* कांटा-निष्पादन
* [[कांटा-निष्पादन|फोर्क-निष्पादन]]
* [[बाहर निकलें (सिस्टम कॉल)]]
* [[बाहर निकलें (सिस्टम कॉल)]]
* स्पॉन (कंप्यूटिंग)
* [[स्पॉन (कंप्यूटिंग)]]
* [[प्रतीक्षा करें (सिस्टम कॉल)]]
* [[प्रतीक्षा करें (सिस्टम कॉल)]]


==संदर्भ==
==संदर्भ==
{{Reflist|30em}}
{{Reflist|30em}}
[[Category: प्रक्रिया (कंप्यूटिंग)]] [[Category: सी पॉज़िक्स लाइब्रेरी]] [[Category: उदाहरण सी कोड वाले लेख]] [[Category: सिस्टम कॉल]]


[[Category: Machine Translated Page]]
[[Category:All articles with failed verification]]
[[Category:All articles with unsourced statements]]
[[Category:Articles with failed verification from November 2019]]
[[Category:Articles with invalid date parameter in template]]
[[Category:Articles with unsourced statements from May 2015]]
[[Category:Articles with unsourced statements from October 2013]]
[[Category:Created On 15/05/2023]]
[[Category:Created On 15/05/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with ignored display titles]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:उदाहरण सी कोड वाले लेख]]
[[Category:प्रक्रिया (कंप्यूटिंग)]]
[[Category:सिस्टम कॉल]]
[[Category:सी पॉज़िक्स लाइब्रेरी]]

Latest revision as of 11:33, 8 June 2023

कम्प्यूटिंग में, विशेष रूप से यूनिक्स ऑपरेटिंग सिस्टम और यूनिक्स के संदर्भ में फोर्क एक संगणिकीय संक्रिया है जिससे एक कंप्यूटर प्रक्रिया स्वयं की एक प्रति बनाती है। यह एक इंटरफ़ेस है जो पॉज़िक्स और सिंगल यूनिक्स विशिष्टता मानकों के अनुपालन के लिए आवश्यक है। यह सामान्यतः फोर्क, क्लोन या कर्नेल (ऑपरेटिंग सिस्टम) के अन्य सिस्टम कॉल के लिए मानक लाइब्रेरी C पर रैपर लाइब्रेरी के रूप में लागू किया जाता है। यूनिक्स जैसे ऑपरेटिंग सिस्टम पर फोर्क प्रक्रिया निर्माण की प्राथमिक विधि है।

अवलोकन

मल्टीटास्किंग ऑपरेटिंग सिस्टम में, प्रोसेस (चल रहे प्रोग्राम) को नई प्रोसेस बनाने के लिए अन्य प्रोग्राम चलाने के लिए एक तरीके की आवश्यकता होती है। फोर्क और इसके प्रकार सामान्यतः यूनिक्स जैसी प्रणालियों में ऐसा करने का एकमात्र तरीका है। प्रक्रिया के लिए एक अलग प्रोग्राम का निष्पादन प्रारम्भ करने के लिए यह पहले स्वयं की एक प्रति बनाने के लिए फोर्क करता है। कॉपी जिसे चाइल्ड प्रोसेस कहा जाता है, दूसरे प्रोग्राम के साथ स्वयं को ओवरले करने के लिए निष्पादन (सिस्टम कॉल) सिस्टम कॉल को कॉल करती है और यह दूसरे के पक्ष में अपने पूर्व प्रोग्राम का निष्पादन बंद कर देती है।

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

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

इतिहास

1962 में प्रकाशित मेल्विन कॉनवे द्वारा ए मल्टीप्रोसेसर सिस्टम डिज़ाइन में एक फोर्क अवधारणा के प्रारम्भिक संदर्भों में से एक दिखाई दिया।[1] कॉनवे के पेपर ने प्रोजेक्ट जिन्न टाइम-शेयरिंग सिस्‍टम में फोर्क के एल. पीटर डिस्‍टक्‍यू द्वारा कार्यान्‍वयन को प्रेरित किया, जहां केन थॉम्पसन द्वारा इसका प्रारम्भ विशेष उपस्थिति के लिए अवधारणा को उधार लिया गया था।[2] अनुसंधान यूनिक्स में[3][4] फोर्क बाद में पॉज़िक्स में एक मानक इंटरफ़ेस बन गया।[5]


संचार

चाइल्ड प्रक्रिया अपने पैरेंट के फाइल डिस्क्रिप्टर की एक प्रति के साथ प्रारम्भ होती है।[5] इंटरप्रोसेस कम्युनिकेशन के लिए, मूल प्रक्रिया प्रायः एक या कई पाइप (कंप्यूटर विज्ञान) बनाती है, और फिर फोर्किंग के बाद प्रक्रियाएं उन पाइपों के सिरों को बंद कर देंगी जिनकी उन्हें आवश्यकता नहीं है।[6]


वेरिएंट

वी फोर्क

वी फोर्क समान कॉलिंग कन्वेंशन और समान शब्दार्थ के साथ फोर्क का एक प्रकार है, लेकिन इसे केवल प्रतिबंधित स्थितियों में उपयोग किया जाता है। यह यूनिक्स के बर्कले सॉफ्टवेयर वितरण संस्करण वर्चुअल मेमोरी का समर्थन करने वाले पहले यूनिक्स में उत्पन्न हुआ[7][8][9]। इसे पॉज़िक्स द्वारा मानकीकृत किया गया था, जिसने वी फोर्क को फोर्क के समान ही व्यवहार करने की अनुमति दी थी, लेकिन 2004 के संस्करण में इसे अप्रचलित चिह्नित किया गया था।[10] और बाद के संस्करणों में स्पॉन (कंप्यूटिंग) पॉज़िक्स स्पॉन फ़ंक्शंस (जो सामान्यतः वी फोर्क के माध्यम से कार्यान्वित किया जाता है) द्वारा प्रतिस्थापित किया गया था।

जब एक वी फोर्क सिस्टम कॉल जारी किया जाता है, तो मूल प्रक्रिया को तब तक निलंबित कर दिया जाएगा जब तक कि चाइल्ड की प्रक्रिया या तो निष्पादन पूरा नहीं कर लेती है या सिस्टम कॉल के निष्पादन (कंप्यूटिंग) समुदाय में से एक के माध्यम से एक नई निष्पादन योग्य छवि के साथ बदल दी जाती है। चाइल्ड पैरेंट से स्मृति प्रबंधन इकाई सेटअप उधार लेता है और स्मृति पृष्ठों को पैरेंट और चाइल्ड की प्रक्रिया के बीच बिना किसी प्रतिलिपि के साझा किया जाता है, और विशेष रूप से कोई कॉपी-ऑन-राइट शब्दार्थ नहीं होता है;[10]इसलिए, यदि चाइल्ड प्रोसेस किसी भी शेयर किए गए पेज में संशोधन करता है, तो कोई नया पेज नहीं बनाया जाएगा और संशोधित पेज पेरेंट प्रोसेस को भी दिखाई देंगे। चूँकि इसमें कोई पृष्ठ प्रतिलिपि सम्मिलित नहीं है (अतिरिक्त मेमोरी का उपभोग), यह तकनीक पूर्ण-प्रतिलिपि वातावरण में सादे फोर्क पर एक अनुकूलन है जो कि निष्पादन के साथ प्रयोग किया जाता है। पॉज़िक्स में, किसी भी उद्देश्य के लिए वी फोर्क का उपयोग निष्पादन समुदाय (और कुछ अन्य चुनिंदा कार्यों) से किसी फ़ंक्शन को तत्काल कॉल करने के लिए छोड़कर अपरिभाषित व्यवहार को उत्पन्न करता है।[10]वी फोर्क की तरह, चाइल्ड डेटा संरचनाओं को कॉपी करने के स्थान पर उन्हें उधार लेता है। वी फोर्क अभी भी एक फोर्क से तेज है जो कॉपी ऑन राइट शब्दार्थ का उपयोग करता है।

यूनिक्स प्रणाली वी ने सिस्टम वीआर 4 प्रस्तुत करने से पहले इस फ़ंक्शन कॉल का समर्थन नहीं किया था,[citation needed] क्योंकि इसके कारण होने वाली स्मृति साझाकरण त्रुटि-प्रवण है:

वी फोर्क पेज टेबल को कॉपी नहीं करता है, इसलिए यह सिस्टम "वी फोर्क" कार्यान्वयन से तेज है। लेकिन चाइल्ड प्रोसेस उसी फिजिकल एड्रेस स्पेस में पेरेंट प्रोसेस के रूप में निष्पादित होता है (exec या exit तक) और इस प्रकार पैरेंट के डेटा और स्टैक को ओवरराइट कर सकता है। अगर कोई प्रोग्रामर वी फोर्क का गलत उपयोग करता है तो एक खतरनाक स्थिति उत्पन्न हो सकती है, इसलिए वी फोर्क को कॉल करने की जिम्मेदारी प्रोग्रामर की होती है। सिस्टम वी दृष्टिकोण और बीएसडी दृष्टिकोण के बीच का अंतर दार्शनिक है: क्या कर्नेल को उपयोगकर्ताओं से इसके कार्यान्वयन के स्वभाव को छिपाना चाहिए, या क्या इसे परिष्कृत उपयोगकर्ताओं को तार्किक कार्य को अधिक कुशलता से करने के लिए कार्यान्वयन का लाभ उठाने का अवसर देना चाहिए?

— मौरिस जे. बौच[11]

इसी तरह, वी फोर्क के लिए लाइनक्स मैन पेज दृढ़ता से इसके उपयोग को हतोत्साहित करता है:[7][failed verification][discuss]

यह दुर्भाग्य की बात है कि लिनक्स ने इस स्पेक्टर को अतीत से पुनर्जीवित किया। बीएसडी मैन पेज बताता है: "उचित सिस्टम साझाकरण तंत्र लागू होने पर यह सिस्टम कॉल समाप्त हो जाएगा। उपयोगकर्ताओं को वी फोर्क() की मेमोरी शेयरिंग सेमेन्टिक्स पर निर्भर नहीं होना चाहिए क्योंकि यह उस स्थिति में यह फोर्क (2) का पर्याय बन जाएगा। "

इसके साथ अन्य समस्याएं vfork गतिशील लिंकिंग के साथ इंटरेक्शन के कारण मल्टी-थ्रेडेड प्रोग्राम में उत्पन्न होने वाले गतिरोध सम्मिलित हैं।[12]मल्टी-थ्रेडेड के प्रतिस्थापन के रूप में vfork इंटरफ़ेस, पॉज़िक्स ने प्रस्तुत posix_spawn कार्यों का समुदाय जो फोर्क और निष्पादन के कार्यों को जोड़ता है। इन कार्यों को लाइब्रेरी fork दिनचर्या के रूप में लागू किया जा सकता है, जैसा लाइनक्स में किया जाता है,[12] या के संदर्भ में vfork बेहतर प्रदर्शन के लिए, जैसा सोलारिस में किया जाता है,[12][13] लेकिन पॉज़िक्स विनिर्देश नोट करता है कि उन्हें सिस्टम कॉल के रूप में डिज़ाइन किया गया था, विशेष रूप से विवश हार्डवेयर और रीयल-टाइम कंप्यूटिंग रीयल-टाइम सिस्टम पर चलने वाले ऑपरेटिंग सिस्टम के लिए कार्यों को जोड़ता है।[14] जबकि 4.4बीएसडी कार्यान्वयन ने वी फोर्क कार्यान्वयन से छुटकारा पा लिया, जिससे वी फोर्क का व्यवहार फोर्क के समान हो गया, इसे बाद में प्रदर्शन कारणों से नेटबीएसडी ऑपरेटिंग सिस्टम में बहाल कर दिया गया।[8] कुछ एम्बेडेड ऑपरेटिंग सिस्टम जैसे कि यूसीलाइनक्स फोर्क को छोड़ देते हैं और केवल वी फोर्क को लागू करते हैं, क्योंकि उन्हें उन उपकरणों पर काम करने की आवश्यकता होती है जहां मेमोरी मैनेजमेंट यूनिट की कमी के कारण कॉपी-ऑन-राइट लागू करना असंभव है।

आरफोर्क

यूनिक्स के डिजाइनरों द्वारा बनाई गई बेल लैब्स ऑपरेटिंग सिस्टम की योजना 9 में फोर्क सम्मिलित है, लेकिन आरफोर्क नामक एक संस्करण भी है, जो एड्रेस स्पेस सहित पैरेंट और चाइल्ड की प्रक्रियाओं के बीच संसाधनों के ठीक-ठाक साझा करने की अनुमति देता है (कॉल स्टैक सेगमेंट को छोड़कर, जो प्रत्येक प्रक्रिया के लिए अद्वितीय है), पर्यावरण चर और फाइलसिस्टम नेमस्पेस;[15] यह इसे प्रक्रियाओं और उनके भीतर थ्रेड (कंप्यूटर विज्ञान) दोनों के निर्माण के लिए एक एकीकृत इंटरफ़ेस बनाता है।[16] फ्रीबीएसडी दोनों[17] और आईआरआईएक्स ने योजना 9 से आर फोर्क सिस्टम कॉल को अपनाया, बाद में इसे स्प्रॉक नाम दिया गया।[18]

क्लोन

clone लिनक्स कर्नेल में एक सिस्टम कॉल है जो एक चाइल्ड प्रोसेस बनाता है जो अपने निष्पादन संदर्भ (कंप्यूटिंग) के कुछ हिस्सों को पैरेंट के साथ साझा कर सकता है। फ्रीबीएसडी के आर फोर्क और आईआरआईएक्स के स्पोक की तरह, लाइनक्स का क्लोन प्लान 9 के आर फोर्क से प्रेरित था और इसका उपयोग थ्रेड्स को लागू करने के लिए किया जा सकता है (हालाँकि एप्लिकेशन प्रोग्रामर सामान्यतः उच्च-स्तरीय इंटरफ़ेस जैसे पथ्रेडस, क्लोन के शीर्ष पर कार्यान्वित) का उपयोग करेंगे। प्लान 9 और आईआरआईएक्स से अलग स्टैक सुविधा को छोड़ दिया गया है क्योंकि (लिनस टोरवाल्ड्स के अनुसार) यह बहुत अधिक ओवरहेड का कारण बनता है।[18]


अन्य ऑपरेटिंग सिस्टम में फोर्किंग

ओपन वीएमएस ऑपरेटिंग सिस्टम (1977) के मूल डिजाइन में, फोर्किंग के रूप में नई प्रक्रिया के लिए कुछ विशिष्ट पतों की सामग्री के बाद के उत्परिवर्तन के साथ एक कॉपी संगणिकीय संक्रिया को जोखिम भरा माना जाता था।[citation needed] वर्तमान प्रक्रिया स्थिति में त्रुटियां चाइल्ड प्रक्रिया में कॉपी की जा सकती हैं। यहां, प्रक्रिया स्पॉनिंग के रूपक का उपयोग किया जाता है: नई प्रक्रिया के मेमोरी लेआउट के प्रत्येक घटक को खरोंच से नवनिर्मित किया जाता है। स्पॉन (कंप्यूटिंग) रूपक को बाद में माइक्रोसॉफ्ट ऑपरेटिंग सिस्टम (1993) में अपनाया गया।

वीएम/सीएमएस (ओपनएक्सटेंशन) का पॉज़िक्स-संगतता घटक फोर्क का एक बहुत ही सीमित कार्यान्वयन प्रदान करता है, जिसमें चाइल्ड को निष्पादित करते समय पैरेंट को निलंबित कर दिया जाता है, और चाइल्ड और पैरेंट एक ही एड्रेस स्पेस साझा करते हैं।[19] यह अनिवार्य रूप से एक फोर्क के रूप में लेबल किया गया एक वी फोर्क है। (यह केवल सीएमएस गेस्ट ऑपरेटिंग सिस्टम पर लागू होता है; अन्य वीएम गेस्ट ऑपरेटिंग सिस्टम, जैसे लाइनक्स, मानक फ़ोर्क कार्यक्षमता प्रदान करते हैं।)

आवेदन उपयोग

हेलो, वर्ल्ड! का निम्न संस्करण! प्रोग्राम यांत्रिकी को प्रदर्शित करता है, fork सी (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में सिस्टम कॉल प्रोग्राम दो प्रक्रियाओं में बंट जाता है, प्रत्येक यह तय करता है कि फोर्क सिस्टम कॉल के रिटर्न वैल्यू के आधार पर वे किस कार्यक्षमता का प्रदर्शन करते हैं। हेडर फाइल जैसे बॉयलरप्लेट कोड को छोड़ दिया गया है।

int main(void)
{
    pid_t pid = fork();

    if (pid == -1) {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }
    else if (pid == 0) {
        printf("Hello from the child process!\n");
        _exit(EXIT_SUCCESS);
    }
    else {
        int status;
        (void)waitpid(pid, &status, 0);
    }
    return EXIT_SUCCESS;
}

इस प्रकार इस प्रोग्राम का एक विच्छेदन है।

   pid_t pid = fork();

में पहला स्टेटमेंट main कॉल करता है, fork निष्पादन को दो प्रक्रियाओं में विभाजित करने के लिए सिस्टम कॉल का रिटर्न वैल्यू fork प्रकार के एक चर में दर्ज किया गया है, pid_t, जो प्रक्रिया पहचानकर्ताओं (पीआईडी) के लिए पॉज़िक्स प्रकार है।

    if (pid == -1) {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }

माइनस वन एक त्रुटि को इंगित करता है, fork: कोई नई प्रक्रिया नहीं बनाई गई थी, इसलिए एक त्रुटि संदेश प्रिंट हुआ है।

अगर fork सफल रहा, तो अब दो प्रक्रियाएँ हैं, दोनों main क्रियान्वित कर रही हैं, main उस बिंदु से कार्य करें जहां fork रिटर्न हुआ। प्रक्रियाओं को अलग-अलग कार्य करने के लिए, प्रोग्राम को रिटर्न वैल्यू पर ब्रांच (कंप्यूटर साइंस) करना चाहिए, fork यह निर्धारित करने के लिए कि क्या यह चाइल्ड प्रोसेस या पैरेंट प्रोसेस के रूप में निष्पादित हो रहा है।

   else if (pid == 0) {
      printf("Hello from the child process!\n");
      _exit(EXIT_SUCCESS);
   }

चाइल्ड प्रक्रिया में, वापसी मान शून्य के रूप में प्रकट होता है (जो एक अमान्य प्रक्रिया पहचानकर्ता है)। चाइल्ड प्रक्रिया वांछित ग्रीटिंग संदेश प्रिंट करती है, फिर बाहर निकलती है। (तकनीकी कारणों से, पॉज़िक्स {{mono|_exit}सी मानक के स्थान पर} यहां फ़ंक्शन exit का उपयोग किया जाना चाहिए।)

   else {
      int status;
      (void)waitpid(pid, &status, 0);
   }

दूसरी प्रक्रिया पैरेंट से प्राप्त करता है, fork चाइल्ड की प्रक्रिया पहचानकर्ता, जो सदैव एक सकारात्मक संख्या होती है। मूल प्रक्रिया इस पहचानकर्ता को पास करती है, waitpid चाइल्ड के बाहर निकलने तक निष्पादन को निलंबित करने के लिए सिस्टम कॉल को पास करती है। जब ऐसा हो जाता है, तो पैरेंट निष्पादन फिर से प्रारम्भ करते हैं और इसके माध्यम से return स्टेटमेंट द्वारा बाहर निकल जाते हैं।

यह भी देखें







संदर्भ

  1. Nyman, Linus (25 August 2016). "फोर्क और जॉइन के इतिहास पर नोट्स". IEEE Annals of the History of Computing. 38 (3): 84–87. doi:10.1109/MAHC.2016.34.
  2. "s3.s from Research UNIX". GitHub. 1970.
  3. Ken Thompson and Dennis Ritchie (3 November 1971). "एसवाईएस फोर्क (द्वितीय)" (PDF). UNIX Programmer's Manual. Bell Laboratories.
  4. Ritchie, Dennis M.; Thompson, Ken (July 1978). "UNIX टाइम-शेयरिंग सिस्टम" (PDF). Bell System Tech. J. AT&T. 57 (6): 1905–1929. doi:10.1002/j.1538-7305.1978.tb02136.x. Retrieved 22 April 2014.
  5. 5.0 5.1 fork – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  6. pipe – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  7. 7.0 7.1 vfork(2) – Linux Programmer's Manual – System Calls
  8. 8.0 8.1 "NetBSD Documentation: Why implement traditional vfork()". NetBSD Project. Retrieved 16 October 2013.
  9. "vfork(2)". UNIX Programmer's Manual, Virtual VAX-11 Version. University of California, Berkeley. December 1979.
  10. 10.0 10.1 10.2 vfork – System Interfaces Reference, The Single UNIX Specification, Version 3 from The Open Group
  11. Bach, Maurice J. (1986). The Design of The UNIX Operating System. Prentice–Hall. pp. 291–292. Bibcode:1986duos.book.....B.
  12. 12.0 12.1 12.2 Nakhimovsky, Greg (May 2006). "एप्लिकेशन सबप्रोसेस बनाने के लिए मेमोरी उपयोग को कम करना". Oracle Technology Network. Oracle Corporation. Archived from the original on Sep 22, 2019.
  13. The OpenSolaris posix_spawn() implementation
  14. posix_spawn – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  15. fork(2) – Plan 9 Programmer's Manual, Volume 1
  16. intro(2) – Plan 9 Programmer's Manual, Volume 1
  17. rfork(2) – FreeBSD System Calls Manual
  18. 18.0 18.1 Torvalds, Linus (1999). "लिनक्स का किनारा". Open Sources: Voices from the Open Source Revolution. O'Reilly. ISBN 978-1-56592-582-3.
  19. "z/VM > z/VM 6.2.0 > Application Programming > z/VM V6R2 OpenExtensions POSIX Conformance Document > POSIX.1 Conformance Document > Section 3. Process Primitives > 3.1 Process Creation and Execution > 3.1.1 Process Creation". IBM. Retrieved April 21, 2015.