امتحان العملي لـ POSIX

سلسلة من الدروس في الـ POSIX

امتحان العملي لـ POSIX

يتألف نظام إرسال و إستقبال بيانات من دارتي المرسل و المستقبل.

تتكون دارة الإرسال من جزأين. يقوم الجزء الأول (Generator )بتوليد سلسلة أعداد مكونة من ستة أرقام ثم يقوم الجزء الثاني (Check) بفحص مجموع هذه الأرقام، فإذا كان أقل من 45 يرسل السلسلة كرسالة إلى دارة الإستقبال ثم يسمح للجزء الأول من الدارة بتوليد سلسلة عددية جديدة و يعود لحالة الانتظار حتى تصبح السلسلة العديدة الجديدة جاهزة.

تتكون دارة اﻹستقبال أيضاً من جزأين. الأول(Check) يقول بفحص صحة الرسالة المستقبلة من خلال إعادتها إلى سلسلة عددية و التأكد أن مجموعها أقل من45. في حال صحة الاختبار مجموع السلسلة أقل من 45- يقوم الجزء الثاني (Process) بمعالجتها – طباعتها.

قم بتصميم النظام السابق بلغة الـ C و POSIX بشكلٍ كامل.

ملاحظة: التنفيذ لا نهائي في كلا الدارتين، والعدد الأعظمي للرسائل في اللحظة الواحدة هو ست رسائل.

ملاحظة: الأرقام العشوائية المولدة تنحصر بين 1-10.

توجيه: قم بتوضيح الحل من خلال جدول تظهر فيه عدد الـ Processes & Threads، و العناصر التي قد تحتاجها

(Signals, Queues, Named Semaphore, or Unnamed Semaphore).

C Hints:

  1. To convert from int array to char array:

    int S[5];

    char m[5];

    for(i=0; i<5; i++)

    m[i] = (char) S[i];

  1. To convert from char array to int array:

    int S[5];

    char m[5];

    for(i=0; i<5; i++)

    S[i] = (int) m[i];

ملاحظة: المادة مفتوحة و يسمح بالمراجع الورقية فقط.

 الحل باستخدام Semaphore:

/*
* Sender.c
*
* Created on: Mar 22, 2012
* Author: zain
*/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<mqueue.h>
#include<semaphore.h>
#include<fcntl.h>

#define QueueMaxSize 6
#define MessageMaxSize 6

float seqeunce[6];
sem_t signal_to_Generator;
sem_t signal_to_Check;
mqd_t exam_q;

float randGenerator()
{
return 10 *(rand() / (RAND_MAX + 1.0));
}

void *thr_Generator(void *Para)
{
int i;

while(1)
{ sleep(1);//for slow down the process and no importance!
for(i=0; i<6; i++)
{
seqeunce[i] = randGenerator();
}
sem_post(&signal_to_Check);
sem_wait(&signal_to_Generator);
continue;
}
}

void *thr_Check(void *Para)
{
int i,sumcheck = 0;
char msgptr[6];
int priority = 5 , msglen = 6;

while(1)
{
sem_wait(&signal_to_Check);

sumcheck = 0;
for(i=0; i<6; i++)
{
sumcheck += seqeunce[i];
}

if (sumcheck < 45)
{
for(i=0; i<6; i++)
{
msgptr[i] = (char) seqeunce[i];
}

if(mq_send(exam_q,msgptr,msglen,priority) != 0)
printf(“Error in sending!\n”);
}
sem_post(&signal_to_Generator);
}
}

int main(int argc, char argv[])
{
pthread_t thrGenerator, thrCheck;

struct mq_attr q;
q.mq_msgsize = MessageMaxSize;
q.mq_maxmsg = QueueMaxSize;

sem_init(&signal_to_Generator,0,0);
sem_init(&signal_to_Check,0,0);

exam_q = mq_open(“/qexam”,O_WRONLY|O_CREAT,0666,&q);

if(-1 != exam_q)
{
pthread_create(&thrGenerator , NULL , thr_Generator , NULL);
pthread_create(&thrCheck , NULL , thr_Check , NULL);

pthread_join(thrGenerator,NULL);
pthread_join(thrCheck,NULL);
}
else printf(“Error!\n”);

mq_unlink(“/qexam”);
mq_close(exam_q);

return 0;
}


/*
* Receiver.c
*
* Created on: Mar 22, 2012
* Author: zain
*/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<mqueue.h>
#include<semaphore.h>
#include<fcntl.h>

int seqeunce[6];
sem_t signal_to_Process;
mqd_t exam_q;

void *thr_Check(void *Para)
{
int i, sumcheck = 0;
char msgptr[7];
int msglen = 7 , msgsize;

while(1)
{
sumcheck = 0;
if(msgsize = mq_receive(exam_q,msgptr,msglen,NULL) > 0)
{
for(i=0; i<6; i++)
{
seqeunce[i] = (int) (msgptr[i]);
sumcheck += seqeunce[i];
}

printf(“sum=%d\n”,sumcheck);

if (sumcheck < 45)
{
sem_post(&signal_to_Process);
}
}
else printf(“Error\n”);
}
}

void *thr_Process(void *Para)
{
int i;

while(1)
{
sem_wait(&signal_to_Process);

printf(“I got the sequance:\n”);
for(i=0; i<6; i++)
{
printf(“%d\t”,seqeunce[i]);
}
printf(“\n”);
}
}

int main(int argc, char argv[])
{
pthread_t thrProcess, thrCheck;

exam_q = mq_open(“/qexam”,O_RDONLY);

sem_init(&signal_to_Process,0,0);

if(-1 != exam_q)
{
pthread_create(&thrCheck , NULL , thr_Check , NULL);
pthread_create(&thrProcess , NULL , thr_Process , NULL);

pthread_join(thrProcess,NULL);
pthread_join(thrCheck,NULL);
}
else printf(“Error!\n”);

mq_unlink(“/qexam”);
mq_close(exam_q);

return 0;
}


الحل باستخدام المتحولات الشرطية:

Sender_Process:

/*
* Sender.c
*
* Created on: Mar 22, 2012
* Author: zain
*/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<mqueue.h>
#include<semaphore.h>
#include<fcntl.h>

#define QueueMaxSize 6
#define MessageMaxSize 6

float seqeunce[6];
pthread_mutex_t mutex_Generator = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_Generator = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex_Check = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_Check= PTHREAD_COND_INITIALIZER;
mqd_t exam_q;

float randGenerator()
{
return 10 *(rand() / (RAND_MAX + 1.0));
}

void *thr_Generator(void *Para)
{
int i;

while(1)
{ sleep(1);//for slow down the process and no importance!
for(i=0; i<6; i++)
{
seqeunce[i] = randGenerator();
}
pthread_mutex_lock(&mutex_Check);
pthread_cond_signal(&cond_Check);
pthread_mutex_unlock(&mutex_Check);
pthread_mutex_lock(&mutex_Generator);
pthread_cond_wait(&cond_Generator,&mutex_Generator);
pthread_mutex_unlock(&mutex_Generator);
continue;
}
}

void *thr_Check(void *Para)
{
int i,sumcheck = 0;
char msgptr[6];
int priority = 5 , msglen = 6;

while(1)
{
pthread_mutex_lock(&mutex_Check);
pthread_cond_wait(&cond_Check,&mutex_Check);
pthread_mutex_unlock(&mutex_Check);

sumcheck = 0;
for(i=0; i<6; i++)
{
sumcheck += seqeunce[i];
}

if (sumcheck < 45)
{
for(i=0; i<6; i++)
{
msgptr[i] = (char) seqeunce[i];
}

if(mq_send(exam_q,msgptr,msglen,priority) != 0)
printf(“Error in sending!\n”);
}
pthread_mutex_lock(&mutex_Generator);
pthread_cond_signal(&cond_Generator);
pthread_mutex_unlock(&mutex_Generator);
}
}

int main(int argc, char argv[])
{
pthread_t thrGenerator, thrCheck;

struct mq_attr q;
q.mq_msgsize = MessageMaxSize;
q.mq_maxmsg = QueueMaxSize;

exam_q = mq_open(“/qexam”,O_WRONLY|O_CREAT,0666,&q);

if(-1 != exam_q)
{
pthread_create(&thrGenerator , NULL , thr_Generator , NULL);
pthread_create(&thrCheck , NULL , thr_Check , NULL);

pthread_join(thrGenerator,NULL);
pthread_join(thrCheck,NULL);
}
else printf(“Error!\n”);

mq_unlink(“/qexam”);
mq_close(exam_q);

return 0;
}

Receiver_Process:

/*
* Receiver.c
*
* Created on: Mar 22, 2012
* Author: zain
*/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<mqueue.h>
#include<semaphore.h>
#include<fcntl.h>

int seqeunce[6];
pthread_mutex_t mutex_Process = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_Process = PTHREAD_COND_INITIALIZER;
mqd_t exam_q;

void *thr_Check(void *Para)
{
int i, sumcheck = 0;
char msgptr[7];
int msglen = 7 , msgsize;

while(1)
{
sumcheck = 0;
if(msgsize = mq_receive(exam_q,msgptr,msglen,NULL) > 0)
{
for(i=0; i<6; i++)
{
seqeunce[i] = (int) (msgptr[i]);
sumcheck += seqeunce[i];
}

printf(“sum=%d\n”,sumcheck);

if (sumcheck < 45)
{
pthread_mutex_lock(&mutex_Process);
pthread_cond_signal(&cond_Process);
pthread_mutex_unlock(&mutex_Process);
}
}
else printf(“Error\n”);
}
}

void *thr_Process(void *Para)
{
int i;

while(1)
{
pthread_mutex_lock(&mutex_Process);
pthread_cond_wait(&cond_Process,&mutex_Process);
pthread_mutex_unlock(&mutex_Process);

printf(“I got the sequance:\n”);
for(i=0; i<6; i++)
{
printf(“%d\t”,seqeunce[i]);
}
printf(“\n”);
}
}

int main(int argc, char argv[])
{
pthread_t thrProcess, thrCheck;

exam_q = mq_open(“/qexam”,O_RDONLY);

if(-1 != exam_q)
{
pthread_create(&thrCheck , NULL , thr_Check , NULL);
pthread_create(&thrProcess , NULL , thr_Process , NULL);

pthread_join(thrProcess,NULL);
pthread_join(thrCheck,NULL);
}
else printf(“Error!\n”);

mq_unlink(“/qexam”);
mq_close(exam_q);

return 0;
}

ملاحظة:

بما أن البرنامجين يقومان بإنشاء ملف الظاهرية و استخدامه، و بما أن التنفيذ لانهائي فعند إجبار البرنامجين على التوقف من خلال ضغط المفتاحين ctrl + c لن يتم حذف الملافات الظاهرية (الوهمية) لذلك يفضل وجود برنامج صغير يقوم بهذه المهمة:

flush:

#include<stdio.h>
#include<stdlib.h>
#include<mqueue.h>

int main()
{
mqd_t exam_q;

exam_q = mq_open(“/qexam”,O_WRONLY);

mq_unlink(“/qexam”);
mq_close(exam_q);

return 0;
}

About زين العابدين

مهندس حواسيب - معهد IDA - جامعة Braunshweig التقنية.
هذا المنشور نشر في دروس تعليمية وكلماته الدلالية , , , , , , , , , , , , . حفظ الرابط الثابت.

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s