यहां हम 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) प्रोग्राम सफलतापूर्वक निष्पादित हुआ