perl

2012-05-11 2 views
9

में कांटा का उपयोग करते समय बच्चे और अभिभावक प्रक्रिया के बीच साझा किए गए चर कैसे प्राप्त करें मैं अपने कोड में कांटा का उपयोग कर रहा हूं। मेरे कोड में कांटा कॉल से पहले, मूल प्रक्रिया में एक वैश्विक चर घोषित किया गया है। तो फोर्क कॉल के बाद बच्चे की प्रक्रिया ग्लोबल वैरिएबल की अपनी अलग थ्रेड स्टैक पर एक अलग प्रति प्राप्त करती है या वैश्विक चर के मौजूदा मूल उदाहरण को साझा करती है। तो मुझे लगता है कि पर तीन संभावनाएं हैं 1) बाल प्रक्रिया को मूल प्रक्रिया 2 में घोषित वैश्विक चर का अलग उदाहरण मिलता है 2) बाल प्रक्रिया वैश्विक चर के साथ वैश्विक चर साझा करती है। (जो संभवतः सत्य नहीं है) 3) बाल प्रक्रिया में पैरेंट थ्रेड में वैश्विक चर के बारे में कोई जानकारी नहीं हैperl

यदि 2 या 3 विकल्प सत्य हैं, तो मैं जानना चाहता हूं कि क्या कोई तरीका है वैश्विक चर और इसकी "राज्य/मूल्य कांटा()" निष्पादन के समय बच्चे की प्रक्रिया में पैरेंट थ्रेड में घोषित किया गया।

इतनी व्यापक रूप से, क्या पैरेंट प्रक्रिया चर का उपयोग करने का कोई तरीका है और फोर्क() का उपयोग करके बनाई गई बाल प्रक्रिया में राज्य है।

उत्तर

11

प्रत्येक प्रक्रिया में इसकी अपनी स्मृति स्थान होती है। एक प्रक्रिया आम तौर पर किसी अन्य प्रक्रिया की स्मृति तक नहीं पहुंच सकती है।

fork के मामले में, बच्चे की प्रक्रिया की मेमोरी स्पेस माता-पिता की सटीक प्रति के रूप में शुरू होती है। इसमें चर, कोड इत्यादि शामिल हैं। इनमें से किसी एक को बदलने से दूसरे में कोई समान चर नहीं बदलेगा।

तो इसका उत्तर # 1 है।


भले ही आप कर सकें, सवाल यह है कि "मैं चर कैसे साझा करूं?" लेकिन "मैं डेटा का आदान-प्रदान कैसे करूं?"। एक नियंत्रित चैनल होने से कम त्रुटि-प्रवण होता है क्योंकि यह लूसर युग्मन और कम-से-कम दूरी प्रदान करता है।

पाइप्स अक्सर माता-पिता और बच्चे के बीच संवाद करने के लिए उपयोग किए जाते हैं, लेकिन कई अन्य विकल्प हैं।

0

यह मामला है "1) बाल प्रक्रिया को मूल प्रक्रिया में घोषित वैश्विक चर का अलग उदाहरण मिलता है"।

अलग प्रक्रियाओं का बिंदु स्मृति को अलग करना है। तो फोर्क होने के बाद आप अभिभावक और बाल प्रक्रिया के बीच चर साझा नहीं कर सकते हैं।

आपको perlipc मैनुअल पेज पर एक नज़र रखना चाहिए जो इंटर-प्रोसेस संचार (आईपीसी) के लिए कुछ अन्य विकल्प सूचीबद्ध करता है। और अभिभावक-बाल संचार के बारे में अन्य स्टैक ओवरफ्लो प्रश्न देखें। कोड की

1

उदाहरण:

my $ipckey = IPC_PRIVATE; 
my $idshm = shmget($ipckey, 200, 0666) || die "\nCreation shared memory failed $! \n"; 

shmread($idshm, $xxx, 0, 1) || warn "\n\n shmread $! \n"; 

shmwrite($idshm, $xxx , 0, 1) || warn "\n\n shmwrite $! \n";