• 0
tantie L

كيف احل مشكلة التواصل بين ال process باستخدام ال pipe

سؤال

السلام عليكم و رحمة الله و بركاته

 

تم تكليفنا بكتابة كود برنامج ينسق العمل بين 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[i];        sms[i] = 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[i];        sms[i] = 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);        }    }}

و شكرا لكل من اجابني مسبقا و وفقكم الله الى ما يرضاه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

وجود النصوص الفرنسية في الحقيقة يصعب فهم البرنامج.

 

هناك بعض الأخطأ لديك

 

wait تأخذ مؤشر لـint، أما أن تمررين لها قيمه أو NULL، ثم أنها تستدعى في العملية الأب وليست في الإبن (انظري هنا).

 

fork تعيد صفر في العملية الأبن وليس في الأب، انظري لتوثيق الدالة (أو من الأمر man 2 fork):

 

[h3]Name[/h3]

fork - create a child process

[h3]Synopsis[/h3]

#include <unistd.h>

pid_t fork(void);


...

[h3]Return Value[/h3]

On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately.

...

 

فعلي التحذيرات عن بناء البرنامج مع gcc استخدمي الخيارات -Wall -Wextra -pedantic للتأكد من عدم وجود أي خطأ، بعضها قد يجعل تصرف البرنامج غير متوقع.

 

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اعتذر عن النصوص الفرنسية فانا لم انتبه لتغييرها اعذر تسرعي استاذي الكريم

 

 

wait تأخذ مؤشر لـint، أما أن تمررين لها قيمه أو NULL، ثم أنها تستدعى في العملية الأب وليست في الإبن (انظري هنا).

 

 

اجل اعرف هذا و اعتقد ان هذا ما فعلته ففي اول استخدام ل wait مررت لها عددا صحيحا و هو 5 و في المرة الثانية لم امرر لها اية قيمة يعني NULL 

    \* الاول *\    pid = fork();    wait(5);
\* الثاني *\    if(pid > 0){        pid = fork();        wait();

و ايضا انا استخدمتها فقط مع الاب فقط ففي الاولى قد كانت مباشرة بعد استخدام fork اذن فهي موجهة للاب و ليس للابن و في الثانية فقد كانت في وسط ال bloc  الخاص بالاب فالشرط كان 

if(pid > 0)

اذن فنحن في الاجراء الاب بسبب ذلك الشرط

 

ارجو المعذرة لكني لم افهم ما قصدته من هذا التحذير استاذ

 

 

فعلي التحذيرات عن بناء البرنامج مع gcc استخدمي الخيارات -Wall -Wextra -pedantic للتأكد من عدم وجود أي خطأ، بعضها قد يجعل تصرف البرنامج غير متوقع.

 

 

بارك فيك الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

wait تستقبل مؤشر لـint أو NULL:

#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);

ليس int أو بدون قيمة (القيمة الفارغة لاتعني NULL!)، المصرف يفترض أن ينبهك على هذه الأخطاء، اقرأي تحذيراته وصلحيها.

 

أيضاً هذا الكود ليس سليم:

pid = fork();wait(5);

بمجرد استدعاء fork، فالعملية الجديدة ستفذ التعليمة التي تليها، wait في هذه الحالة,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .