fork() এবং pipe() ব্যবহার করে দুটি প্রসেসের মধ্যে কমিউনিকেশন ডেমো: প্যারেন্ট (P1) ইনপুট নেয়, চাইল্ড (P2)-এ পাইপ দিয়ে পাঠায়, P2 একটি ফিক্সড স্ট্রিং কনক্যাট করে আবার পাইপ দিয়ে পাঠায়, P1 প্রিন্ট করে।
fork() ও pipe() সংক্ষিপ্ত
- fork(): চাইল্ড প্রসেস তৈরি করে। রিটার্ন <0 (ফেইল), =0 (চাইল্ড), >0 (প্যারেন্টে চাইল্ডের PID)।
- pipe(): ইউনিক্স/লিনাক্স সিস্টেম কল, ইন্টার-প্রসেস কমিউনিকেশনের জন্য। One-way।
উদাহরণ
ইনপুট: "Learn programming" (P1-এ)
ফিক্সড স্ট্রিং: " at tutorialspoint" (P2-এ)
আউটপুট: "Learn programming at tutorialspoint"
পদ্ধতি
- দুটি পাইপ: p12 (P1→P2), p21 (P2→P1)।
- fork() কল করে P1 (প্যারেন্ট) এবং P2 (চাইল্ড) তৈরি।
- P1: ইনপুট পড়ে p12-এ লিখে, wait(), p21-এ পড়ে প্রিন্ট।
- P2: p12-এ পড়ে, কনক্যাট করে, p21-এ লিখে, exit।
C প্রোগ্রাম উদাহরণ
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/wait.h>
int main() {
int p12[2], p21[2];
char fixed_str[] = " at tutorialspoint";
char input_str[100];
pid_t P;
if (pipe(p12)==-1 || pipe(p21)==-1) { perror("pipe"); return 1; }
scanf("%s", input_str);
P = fork();
if (P < 0) { perror("fork"); return 1; }
else if (P > 0) { /* Parent */
close(p12[0]);
write(p12[1], input_str, strlen(input_str)+1);
close(p12[1]);
wait(NULL);
char concat_str[100];
close(p21[1]);
read(p21[0], concat_str, 100);
printf("Concatenated string: %s\n", concat_str);
close(p21[0]);
} else { /* Child */
close(p12[1]);
char concat_str[100];
read(p12[0], concat_str, 100);
int k = strlen(concat_str);
for (int i=0; fixed_str[i]; i++) concat_str[k++] = fixed_str[i];
concat_str[k] = '\0';
close(p12[0]);
close(p21[0]);
write(p21[1], concat_str, strlen(concat_str)+1);
close(p21[1]);
exit(0);
}
return 0;
}
আউটপুট
Concatenated string: Learn at tutorialspoint