2012-11-19 34 views
14

मैं का उपयोग कर प्रक्रिया की प्रतियां बनाना चाहता हूं 0) सी में मैं समझ नहीं पा रहा हूं कि मेरी प्रक्रिया की प्रतियों के लिए तर्क कैसे पारित किया जाए। उदाहरण के लिए, मैं प्रक्रिया प्रतियों के लिए एक पूर्णांक पास करना चाहता हूं।फोर्क द्वारा बनाई गई प्रक्रियाओं के लिए तर्क कैसे पारित करें()

या मैं अगर मैं एक पाश जिसमें मैं कांटा() फोन और प्रक्रियाओं के लिए एक अनूठा मूल्य पास करना चाहते हैं तो क्या करें, (उदाहरण के लिए 0 ... एन)

for (int i = 0; i < 4; ++i) { 
    fork(); 
    // pass a unique value to new processes. 
} 
+2

'फोर्क' एक चल रही प्रक्रिया की एक प्रति बनाता है, यह * प्रक्रिया * शुरू नहीं करता है। – Beta

+0

पढ़ें http://advancedlinuxprogramming.com/ –

उत्तर

15

fork() के बारे में अच्छा बात यह है कि प्रत्येक प्रक्रिया आप स्वचालित रूप से अंडे सब कुछ की एक प्रति हो जाता है माता पिता है, उदाहरण के लिए हां, मान लें कि एक पूर्णांक myvar दो बच्चे प्रक्रियाओं में से प्रत्येक को पारित करने के लिए चाहते हैं, लेकिन मैं हर माता-पिता की प्रक्रिया से भिन्न मान करना चाहते हैं:

int main() 
{ 
    int myvar = 0; 
    if(fork()) 
     myvar = 1; 
    else if(fork()) 
     myvar = 2; 
    else 
     myvar = 3; 

    printf("I'm %d: myvar is %d\n", getpid(), myvar); 
    return 0; 
} 

ऐसा करने से इस की अनुमति देता है प्रत्येक प्रक्रिया myvar की एक "कॉपी" के लिए इसके अपने मूल्य के साथ।

I'm 8517: myvar is 1 
I'm 8518: myvar is 2 
I'm 8521: myvar is 3 

यदि आपने मूल्य नहीं बदला है, तो प्रत्येक फोर्क प्रक्रिया में वही मूल्य होगा।

+0

धन्यवाद माइक। आप सिर पर नाखून मारा –

1

की exec() family देखें कार्य करता है।

संपादित करें: यदि आप मूल प्रक्रिया के समान प्रोग्राम की प्रतियों को प्रारंभ करने का प्रयास कर रहे हैं, तो बस duskwuff द्वारा सुझाए गए चर का उपयोग करना जारी रखें।

1

आप क्लोन() (जिसका उपयोग वास्तव में फोर्क() द्वारा किया जाता है) का उपयोग कर सकते हैं। यह आपको आपके प्रविष्टि फ़ंक्शन में arg पास करने देता है।

http://linux.die.net/man/2/clone

+3

नहीं, कृपया नहीं। 'क्लोन 'एक जटिल, लिनक्स विशिष्ट, सिस्कल है जिसके लिए लिनक्स के बहुत अच्छे ज्ञान की आवश्यकता होती है, और ज्यादातर कुछ गुरु * कार्यान्वयन * थ्रेड लाइब्रेरीज़ (à la pthread) के लिए आरक्षित है। 'Futex (7)' मैन पेज भी देखें। –

+0

@ बेसिलस्टारनकेविच: बिल्कुल। केवल क्लोन का उपयोग करें यदि आप कुछ वास्तविक निम्न स्तर की हैकिंग कर रहे हैं - क्लोन का एकमात्र बिंदु आपको उपयोगकर्ताओं के स्थान पर कुछ चीजें करने की अनुमति देता है जो पहले केवल कर्नेल स्पेस जैसे थ्रेड कार्यान्वयन में हो सकता है। यह एक सामान्य उपयोग syscall नहीं है। – Linuxios

7

स्थानीय और वैश्विक चर स्वाभाविक एक fork() भर में संरक्षित कर रहे हैं, तो "तर्कों से पारित" की कोई जरूरत नहीं है। आप काँटेदार प्रक्रिया में एक समारोह कॉल कर रहे हैं, तो आप की तरह कुछ कर सकते हैं:

pid_t pid = fork(); 
if (pid == 0) { 
    funcToCallInChild(argument); 
    exit(0); 
} 
6

मैं प्रतिक्रिया करने के लिए देर हो रही है, लेकिन यहाँ कैसे मैं यह कर रहा है:

const char *progname = "./yourProgName"; 
const char *argument1 = "arg1"; 
const char *argument2 = "arg2"; 

if (fork() == 0) 
{ 
    // We are the child process, so replace the process with a new executable. 
    execl(progname, progname, argument1, argument2, (char *)NULL); 
} 
// The parent process continues from here. 

सबसे पहले, आप कांटा() प्रक्रिया एक नई प्रक्रिया बनाने के लिए। यह अभी भी वही स्मृति स्थान पुराना है। कांटा() दोनों माता-पिता और बाल प्रक्रियाओं के लिए रिटर्न। अगर कांटा() शून्य लौटाता है, तो आप बच्चे की प्रक्रिया कर रहे हैं। तब बाल प्रक्रिया प्रक्रिया मेमोरी को एक नई फाइल से बदलने के लिए execl() का उपयोग करती है।

ध्यान दें कि progname execl() को दो बार दिया जाता है। पहला यह है कि execl() वास्तव में चलाने की कोशिश करेगा, दूसरा argv [0] है। आपको दोनों को प्रदान करना होगा या तर्क गणना एक से बंद हो जाएगी। वांछित निष्पादन योग्य छवि को खोजने के लिए प्रोनमेम में सभी आवश्यक पथ जानकारी होनी चाहिए।

मैं इस उदाहरण में दो तर्क देता हूं, लेकिन आप जितना चाहें उतना पास कर सकते हैं। इसे न्यूल के साथ समाप्त किया जाना चाहिए, और मुझे लगता है कि आपको इसे दिखाने के रूप में इसे (char *) के रूप में डालना होगा।

यह दृष्टिकोण आपको तर्कों और एक अद्वितीय पिड के साथ पूरी तरह से स्वतंत्र प्रक्रिया प्रदान करता है। यह पेरेंट प्रक्रिया समाप्त होने के बाद लंबे समय तक चलना जारी रख सकता है, या यह माता-पिता के समक्ष समाप्त हो सकता है।