السلام عليكم سبق و طرحت محاولتي لكن لا احد ساعدني رجاءا لكل من يعرف اي مثال لبرنامج Cفيه انشاء لاكثر من Process عن طريق Fork يتعاملون كلهم مع Parent عن طريق Pipe قصد انجاز عمل باقصر وقت ارجو مدي به و جازاكم الله خيرا
رجاءا مساعدة عاجلة في هذا البرنامج
و عليكم السلام,
اقتباسالسلام عليكم سبق و طرحت محاولتي لكن لا احد ساعدني رجاءا لكل من يعرف اي مثال لبرنامج Cفيه انشاء لاكثر من Process عن طريق Fork يتعاملون كلهم مع Parent عن طريق Pipe قصد انجاز عمل باقصر وقت ارجو مدي به و جازاكم الله خيرا
لاحظي أن أسئلتك كلها بدون محاولات, و هذا يعني أن مصيرها الأصلي يجب أن يكون الغلق في هذا المنتدى. ثانياً, قمت بطرح عدة أمثلة في موضوعك الأول, و أنت هنا لم توضحي لنا ماهي المشكلة تحديداَ؟!
أخيراً, المنتدى ليس لحل الواجبات البرمجية يا رعاك الله, فنحن هنا للاستفادة و الإفادة,
عموماً, هذا مثال مبسط قمت بكتابته أيضاً, لأجل توضيح الفكرة, و لكنه متكامل,
الفكرة هو أن هناك ثلاث processes, الأول يسمى grand parent و الثاني parent و الثالث child,
حيث أن grand parent يقوم بإنشاء parent ثم يقوم parent بإنشاء child,
ببساطة:
grand parent ----> parent ----> child
الذي سيحصل, هو أن grand parent سيستقبل جملة نصية يدخلها المستخدم, ثم يرسلها لـ parent الذي سيقوم بعمل reverse للنص, ثم يرسلها لـ child الذي يقوم بعمل capitalization للحروف, و من ثم يعيدها لـ grand parent الذي يقوم بطباعة الجملة بعد عكسها و تكبير الحروف,
رجاءً مرة أخرى, فلتكن الأسئلة أكثر دقة من "أريد مثال", فهناك عدد لا منتهي من الأمثلة التي يمكن كتابتها,
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define PIPE 2
#define READ 0
#define WRITE 1
#define MAX 100
void reverse(char* str)
{
int beg = 0, end = strlen(str) - 1;
char temp;
while(beg < end)
{
temp = str[beg];
str[beg] = str[end];
str[end] = temp;
beg++;
end--;
}
}
void convert_str_toupper(char* str)
{
int i;
for(i = 0; i < strlen(str); i++)
{
str = toupper(str);
}
}
int main()
{
int fpd[PIPE], spd[PIPE], tpd[PIPE];
char buf[MAX];
// [writer, reader]
pipe(fpd); // [grand parent, parent]
pipe(spd); // [parent, child]
pipe(tpd); // [child, grand parent]
if( fork() ) // grand parent
{
close(fpd[READ]);
close(spd[READ]);
close(spd[WRITE]);
close(tpd[WRITE]);
printf("Enter some string: ");
fgets(buf, MAX, stdin);
buf[strlen(buf)-1] = 0;
write(fpd[WRITE], buf, strlen(buf)+1);
read(tpd[READ], buf, MAX);
printf("result string: %s \n", buf);
close(fpd[WRITE]);
close(tpd[READ]);
}
else // parent
{
if( fork() ) // parent
{
close(fpd[WRITE]);
close(spd[READ]);
close(tpd[READ]);
close(tpd[WRITE]);
read(fpd[READ], buf, MAX);
reverse(buf);
write(spd[WRITE], buf, strlen(buf)+1);
close(fpd[READ]);
close(spd[WRITE]);
}
else // child
{
close(fpd[READ]);
close(fpd[WRITE]);
close(spd[WRITE]);
close(tpd[READ]);
read(spd[READ], buf, MAX);
convert_str_toupper(buf);
write(tpd[WRITE], buf, strlen(buf)+1);
close(spd[READ]);
close(tpd[WRITE]);
}
}
return 0;
}جزيت خيرا اخي خالد على ردك الوافي .. ولكن هناك تعديل بسيط على داله العكس , حيث يجب ان تكون المتغير end كالتالي :
end = (strlen(str) - 1)/2
شكراً أخي محمد,
أنا آسف, و لكني لم أفهم لماذا end يجب أن تشير إلى منتصف النص, أنا جعلت end تشير لآخر حرف, و beg تشير إلى أول حرف, و من ثم أقوم بتحريكهم باتجاه بعض مع تبديل الأحرف بين الموقعين.
تحياتي,
السلام عليكم عندما قلت اني قد قدمت محاولة كان الامر كذلك وكانت مع المرفقات بامكانك التاكد المحاولة بعنوان’ C Linuxالرجاء مساعدتي في اصلاح هذا البرنامج و جازاكم الله خيرا و بتاريخ dec 29
سامحكم الله .
يا رب لك الحمد حتى ترضى و اذا رضيت و بعد ان ترضى
Khaled.Alshaya كتب:شكراً أخي محمد,
أنا آسف, و لكني لم أفهم لماذا end يجب أن تشير إلى منتصف النص, أنا جعلت end تشير لآخر حرف, و beg تشير إلى أول حرف, و من ثم أقوم بتحريكهم باتجاه بعض مع تبديل الأحرف بين الموقعين.
تحياتي,
فعلاً , الخطأ مني لم انتبه جيداً الى شرط حلقة الـ while .. معذره ..


