এখানে আমরা C-তে fork() এবং exec() সিস্টেম কলের প্রভাব দেখতে পাব। কলিং প্রক্রিয়ার নকল করে একটি নতুন প্রক্রিয়া তৈরি করতে ফর্ক ব্যবহার করা হয়। নতুন প্রক্রিয়া শিশু প্রক্রিয়া। নিম্নলিখিত সম্পত্তি দেখুন.
- শিশু প্রক্রিয়াটির নিজস্ব অনন্য প্রক্রিয়া আইডি রয়েছে৷ ৷
- শিশু প্রক্রিয়ার অভিভাবক প্রক্রিয়া আইডি কলিং প্রক্রিয়ার প্রক্রিয়া আইডির মতোই৷
- শিশু প্রক্রিয়াটি পিতামাতার মেমরি লক এবং সেমাফোরের উত্তরাধিকারী হয় না৷
ফর্ক() চাইল্ড প্রক্রিয়ার পিআইডি ফেরত দেয়। যদি মানটি অ-শূন্য হয়, তবে এটি পিতামাতার প্রক্রিয়ার আইডি, এবং যদি এটি 0 হয়, তবে এটি চাইল্ড প্রক্রিয়ার আইডি৷
exec() সিস্টেম কলটি বর্তমান প্রসেস ইমেজকে নতুন প্রসেস ইমেজ দিয়ে প্রতিস্থাপন করতে ব্যবহৃত হয়। এটি বর্তমান স্পেসে প্রোগ্রাম লোড করে, এবং এন্ট্রি পয়েন্ট থেকে চালায়।
সুতরাং fork() এবং exec() এর মধ্যে প্রধান পার্থক্য হল যে ফর্ক নতুন প্রক্রিয়া শুরু করে যা মূল প্রক্রিয়ার একটি অনুলিপি। 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) { //when process id is negative, there is an error, unable to fork
printf("can't fork, error occured\n");
exit(EXIT_FAILURE);
} else if (process_id == 0) { //the child process is created
printf("The child process is (%u)\n",getpid());
char * argv_list[] = {"ls","-lart","/home",NULL};
execv("ls",argv_list); // the execv() only return if error occured.
exit(0);
} else { //for the parent process
printf("The parent process is (%u)\n",getppid());
if (waitpid(process_id, &state, 0) > 0) { //wait untill the process change its state
if (WIFEXITED(state) && !WEXITSTATUS(state))
printf("program is executed successfully\n");
else if (WIFEXITED(state) && WEXITSTATUS(state)) {
if (WEXITSTATUS(state) == 127) {
printf("Execution failed\n");
} else
printf("program terminated with non-zero status\n");
} else
printf("program didn't terminate normally\n");
}
else {
printf("waitpid() function failed\n");
}
exit(0);
}
return 0;
} আউটপুট
The parent process is (8627) The child process is (8756) program is executed successfully