fork(): কলিং প্রসেস কপি করে নতুন প্রসেস (child) তৈরি করে।
- Child-এর ইউনিক PID থাকে
- Parent PID child-এর parent PID হয়
- Child parent-এর মেমরি লক ও সেমাফোর ইনহেরিট করে না
fork() child-এর PID রিটার্ন করে। Parent-এ non-zero (child PID), Child-এ ০ রিটার্ন করে।
exec(): করেন্ট প্রসেস ইমেজকে নতুন প্রসেস ইমেজ দিয়ে রিপ্লেস করে। প্রোগ্রাম কারেন্ট স্পেসে লোড হয়ে এন্ট্রি পয়েন্ট থেকে চালু হয়।
মূল পার্থক্য: fork() নতুন প্রসেস তৈরি করে (parent ও child একসাথে চলে), 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, state;
process_id = fork();
if (process_id == -1) {
printf("can't fork, error occured\n");
exit(EXIT_FAILURE);
} else if (process_id == 0) {
printf("The child process is (%u)\n", getpid());
char *argv_list[] = {"ls", "-lart", "/home", NULL};
execv("ls", argv_list);
exit(0);
} else {
printf("The parent process is (%u)\n", getppid());
if (waitpid(process_id, &state, 0) > 0) {
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