Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में fork() और exec() में अंतर

यहां हम C में fork() और exec() सिस्टम कॉल के प्रभाव को देखेंगे। fork का उपयोग कॉलिंग प्रोसेस को डुप्लिकेट करके एक नई प्रोसेस बनाने के लिए किया जाता है। नई प्रोसेस चाइल्ड प्रोसेस होती है। निम्नलिखित गुण देखें।

  • चाइल्ड प्रोसेस की अपनी विशिष्ट प्रोसेस आईडी होती है।
  • चाइल्ड प्रोसेस की पैरेंट प्रोसेस आईडी कॉलिंग प्रोसेस की प्रोसेस आईडी के समान होती है।
  • चाइल्ड प्रोसेस पैरेंट के मेमोरी लॉक और सेमाफोर्स को विरासत में नहीं लेती।

fork() चाइल्ड प्रोसेस की PID लौटाता है। यदि मान शून्येतर है तो यह पैरेंट प्रोसेस की आईडी है, और यदि यह 0 है तो यह चाइल्ड प्रोसेस की आईडी है।

exec() सिस्टम कॉल का उपयोग वर्तमान प्रोसेस छवि को नई प्रोसेस छवि से बदलने के लिए किया जाता है। यह प्रोग्राम को वर्तमान स्पेस में लोड करता है और एंट्री पॉइंट से चलाता है।

इसलिए fork() और exec() के बीच मुख्य अंतर यह है कि fork मुख्य प्रोसेस की कॉपी के रूप में नई प्रोसेस शुरू करता है। exec() वर्तमान प्रोसेस छवि को नई से बदल देता है। दोनों पैरेंट और चाइल्ड प्रोसेस एक साथ निष्पादित होते हैं।

उदाहरण

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

int main() {
    pid_t process_id;
    int return_val = 1;
    int state;
    process_id = fork();
    if (process_id == -1) { // जब प्रोसेस आईडी नकारात्मक है, तो त्रुटि है, fork करने में असमर्थ
        printf("fork नहीं कर सकते, त्रुटि हुई\n");
        exit(EXIT_FAILURE);
    } else if (process_id == 0) { // चाइल्ड प्रोसेस बनाई गई
        printf("चाइल्ड प्रोसेस है (%u)\n", getpid());
        char *argv_list[] = {"ls", "-lart", "/home", NULL};
        execv("ls", argv_list); // execv() केवल तभी लौटाता है जब त्रुटि हुई हो
        exit(0);
    } else { // पैरेंट प्रोसेस के लिए
        printf("पैरेंट प्रोसेस है (%u)\n", getppid());
        if (waitpid(process_id, &state, 0) > 0) { // प्रोसेस के स्टेट बदलने तक प्रतीक्षा करें
            if (WIFEXITED(state) && !WEXITSTATUS(state))
                printf("प्रोग्राम सफलतापूर्वक निष्पादित हुआ\n");
            else if (WIFEXITED(state) && WEXITSTATUS(state)) {
                if (WEXITSTATUS(state) == 127) {
                    printf("निष्पादन विफल\n");
                } else
                    printf("प्रोग्राम गैर-शून्य स्टेटस के साथ समाप्त हुआ\n");
            } else
                printf("प्रोग्राम सामान्य रूप से समाप्त नहीं हुआ\n");
        } else {
            printf("waitpid() फ़ंक्शन विफल\n");
        }
        exit(0);
    }
    return 0;
}

आउटपुट

पैरेंट प्रोसेस है (8627)
चाइल्ड प्रोसेस है (8756)
प्रोग्राम सफलतापूर्वक निष्पादित हुआ
  1. - MEAN.js और MEAN.io में अंतर?

    MEAN, MongoDB, Express, Angular, और Node.js का संक्षिप्त नाम है। MEAN.js और MEAN.io अनिवार्य रूप से एक ही चीजें हैं क्योंकि वे दोनों स्कैफोल्डेड एप्लिकेशन या ऊपर बताई गई 4 चीजों का उपयोग करने के लिए बेसिक सेटअप हैं। ये लाइब्रेरीज/टूल्स आपके लिए पहले से ही ये सेटअप करते हैं। ये आपको बेसिक इंफ्रास्ट्

  1. CSS Display और Visibility में अंतर CSS Display और Visibility में अंतर

    हम HTML डॉक्यूमेंट में किसी एलिमेंट को CSS Visibility और CSS Display प्रॉपर्टीज से क्रमशः छुपा या हटा सकते हैं। उपयोगकर्ता को दोनों प्रॉपर्टीज के उपयोग में कोई अंतर नहीं लग सकता, लेकिन अंतर है। CSS Display - none एलिमेंट को डॉक्यूमेंट पर रेंडर नहीं करता और इस प्रकार इसे कोई स्थान आवंटित नहीं करता।

  1. Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या Bash में $$ बनाम $BASHPID समझें: प्रोसेस ID वेरिएबल्स की व्याख्या

    हाल ही में मैं एक शेल स्क्रिप्ट पर काम कर रहा था और मैंने देखा कि bash स्पेशल वेरिएबल $$ और $BASHPID कैसे व्यवहार करते हैं, इसमें एक महत्वपूर्ण अंतर है। लिनक्स में चलने वाली हर प्रोसेस को एक प्रोसेस ID असाइन किया जाता है और इस तरह ऑपरेटिंग सिस्टम प्रोसेस को संभालता है। संबंधित पढ़ें: Bash में Sourc