السلام عليكم و رحمة الله و بركاته
تم تكليفنا بكتابة كود برنامج ينسق العمل بين 3 من ال process حيث يكون عندنا "إجراء أب" و "إجراء ابن 1" و "أجراء ابن 2" و فقط ملاحظة للعلم : بما ان هذا الكود يستخدم الدالتين () fork و () pipe فهو يشتغل فقط على اللونيكس و هذا على حسب علمي كون تلكما الدالتين خاصتين بنظام التشغيل اللونيكس
نقوم بانشاء الاجراء الابن 1 باستخدام fork و نقوم بعدها بايقاف عمل الاجراء الاب باستخدام wait كي لا ينفذ الاب نفس تعليمات الابن و الاجراء الابن 1 سيقوم بطلب رسالة من المستخدم و يقوم بحفظها في طرف ال pipe الخاص بالكتابة
هذه هي التعليمات الخاصة بانشاء الاجراء الابن 1 و جعل الاجراء الاب في حالة انتظار
pid = fork(); wait(5);
و هذه هي التعليمات الخاصة بالاجراء الابن 1 ليقوم بطلب الرسالة من المستخدم و يقوم بحفظها في الجزء الخاص بالكتابة في ال pipe الاول و الشرط الذي يجعلني اعمل على الاجراء الابن 1 هي القيمة التي ترجعها fork فان كانت 0 معناه اننا نعمل على الاجراء الابن و ان كانت اكبر من الصفر تمام فهذا يعني اننا نعمل على الاجراء الاب
if(pid == 0){
printf("le fils_1 :\nentrer le message : ");
scanf("%s", sms);
close(DT_1[0]);
write(DT_1[1], &sms,len);
close(DT_1[1]);
exit (0);
}بعدها يتوقف الاجراء الابن 1 و يعود الاجراء الاب للعمل فيقوم بانشاء اجراء ابن 2 باستعمال fork مرة اخرى و نوقف الاب عن العمل ثانية ليقوم الاجراء الابن 2 بقراءة المعلومة التي قام الاجراء الابن 1 بتسجيلها في ال pipe الاول ثم يقوم بتشفيرها (يقلب الرسالة) و بعدها يقوم بكتابتها في جهة الكتابة الخاصة بال pipe الثاني و هي التعليمات الخاصة بها
if(pid > 0){
pid = fork();
wait();
if(pid == 0){
printf("\nle fils_2 :");
read(DT_1[0], &sms, len);
codage();
close(DT_2[0]);
write(DT_2[1], &sms,len);
close(DT_2[1]);
exit (0);
}بعد ان يقوم الاجراء الابن 2 بانهاء تعليماته يغادر و يبقى الاجراء الاب لوحده يقوم بقراءة ما تركه له الاجراء الابن 2 فيقوم بفك تشفيره و طباعته على الشاشة ثم يغادر هو ايضا و هذه هي التعليمات الخاصة به
if(pid > 0){
printf("\nle pere :");
read(DT_2[0], &sms, len);
decodage();
//puts(sms);
exit (0);
}لكن عند التنفيذ فقط الاجراء الابن 1 هو من يؤدي مهمته فيقوم باخذ الرسالة من المستخدم و اما الاجراء الابن 2 و الاجراء الاب فلا يعملان و السبب هو ان محتوى الرسالة لا يصلهم فحاولت اخراج هذه التعليمات خارج الجزء الخاص بالاجراء الابن 1
printf("le fils_1 :\nentrer le message : ");
scanf("%s", sms);فوصلت الرسالة للجراء الابن 2 و للاب فقام الاجراء الابن 2 بمهمته بالتشفير لكن الاجراء الاب لم يقم بمهمته بسبب وجود اجراء اخر دخيل يقوم هو بعمل الاب فلم اعرف كيف احل هذا الخطأ فهلا افدتموني و اعنتموني بارك فيك الله و ها هو الكود باكمله حتى يكون التتبع افضل
#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>char sms[20];int i,len;char im;void codage(){ printf("\ncodage: "); for (i = 0; i < (strlen(sms)) / 2; i++){ im = sms[(strlen(sms)) - i - 1]; sms[(strlen(sms)) - i - 1] = sms; sms = im; } puts(sms);}void decodage(){ printf("\ndecodage: "); for (i = 0; i < (strlen(sms)) / 2; i++){ im = sms[(strlen(sms)) - i - 1]; sms[(strlen(sms)) - i - 1] = sms; sms = im; } puts(sms);}main(){ int DT_1[2], DT_2[2]; int pid; if(pipe(DT_1) == -1){ printf("erreur, le tube n'est cree pas\n"); return (1); } if(pipe(DT_2) == -1){ printf("erreur, le tube n'est cree pas\n"); return (1); } pid = fork(); wait(5); if(pid == 0){ printf("le fils_1 :\nentrer le message : "); scanf("%s", sms); close(DT_1[0]); write(DT_1[1], &sms,len); close(DT_1[1]); exit (0); } if(pid > 0){ pid = fork(); wait(); if(pid == 0){ printf("\nle fils_2 :"); read(DT_1[0], &sms, len); codage(); close(DT_2[0]); write(DT_2[1], &sms,len); close(DT_2[1]); exit (0); } if(pid > 0){ printf("\nle pere :"); read(DT_2[0], &sms, len); decodage(); exit (0); } }}و شكرا لكل من اجابني مسبقا و وفقكم الله الى ما يرضاه