Exercise+5.1

Når vi bruger code class MyClass { int x, y ,z; }; struct Message{ long int type; MyClass data; }; code pakker vi klassen dataen ind i en struct, således x, y og z bliver mast sammen til være i struct'ens data.

=Exercise 1= toc I exercise 1 skal vi lave en struct, som indeholde værdien for x, y og z. Hvad er en struct: Dette har vi gjort ved at oprette en Point3D.h fil, som indeholder code format="cpp" class Point3D { public: int x;   int y;    int z; };

struct Message {   long int type; Point3D data; }; code Da denne var lavet, skulle vi lave to funktioner en sender, som skal sende et Point3D objekt til receiver i en message queue ca en gang i sekundet og en receiver funktion som skal løbende skal vente på en ny meddelelse, og ved modtagelse af x, y og z skal de udskrives Vores funktioner ser ud som følgende code format="cpp" void *sender(void *arg_id) {   Message msg1; msg1.type =1; int i = 0; long int id; id = (long int) arg_id; cout << "ID. send " << id << endl;

while (true) {       msg1.data.x = i;        msg1.data.y = i+1; msg1.data.z = i+2; cout << "send:    " << "X: " << msg1.data.x << " Y: " << msg1.data.y << " Z: " << msg1.data.z << endl; msgsnd(id, (void*) &msg1, sizeof(Point3D),0); sleep(1); i++; } }

void *receiver(void *arg_id) {   Message msg2;

long int id; id = (long int) arg_id; cout << "recieve id " << id << endl;

while (true){ msgrcv(id, (void*) &msg2, sizeof(Point3D),0, 0); cout << "modtaget: " << "X: " << msg2.data.x << " Y: " << msg2.data.y << " Z: " << msg2.data.z << endl << endl; }

}

code

=Exercise 2= Der skal oprettes en main som gør brug af sender og receiver, som opretter en message queue. Hvad er message queue: For at gøre brug af System V IPC message queue, skal der inkluderes disse header. code format="cpp" code For at oprette en message queue, bruges code format="cpp" long int id = msgget((key_t) 100, 0666 | IPC_CREAT); code Dette bliver lagt ind i et id, som sendes med ved oprettelse af tråden, så sender og receiver bruger samme kø. code format="cpp" // oprettelse af sender tråd id_ref0 = pthread_create(&send, NULL, sender, (void*) id))
 * 1) include
 * 2) include
 * 3) include

// oprettelse af receive tråd id_ref0 = pthread_create(&receiv, NULL, receiver, (void*)id))

code For at slette en message queue, bruges code format="cpp" msgctl(id, IPC_RMID, NULL); code

=Exercise 3= I denne opgave skal vi oprette en template class MsgWrapper, som indeholder to medlems variabler. 1) long int type 2) Msg data Disse skal laves public. code format="cpp" template  class MsgWrapper { public: long int type; Msg data; }; code

=Exercise 4= I denne opgave skal vi lave en template funktion sendMsg: Den skal have følgende pre-/postcondition //Precondition: msgQId is the ID of a valid message queue// Postcondition: The contents of ‘data’ has been sent to the message queue identified by msgQId

Funktionen skal oprette et MessageWrapper objekt ved navn msg og sætte dets data lig 'data', samt sætte dets type lig med 1. Tilsidst return vi msgsnd. code format="cpp" template ssize_t sendMsg(int msgQId, const Msg& data) {	MsgWrapper msg; msg.type =1; msg.data = data; // int msgsnd( key_t msgQId, void* msg_ptr, size_t msgSz, int msgflg ); return msgsnd(msgQId, (void *) &msg, sizeof(msg.data), 0); } code

=Exercise 5= Den sidste template funktion der skal oprettes er receiveMsg: den skal oprette et objekt msg og bruge det til at modtage fra message queue Efter modtagelsen skal 'data' være lig med msg.data. Til sidst skal den returnere hvad receive modtager. code format="cpp" template ssize_t receiveMsg(int msgQId, Msg& data) {	MsgWrapper msg; int newMessage = msgrcv(msgQId, (void*) &msg, sizeof(msg.data),0, 0); data = msg.data; return newMessage; } code

=Exercise 6= I den sidste opgave skal vi samle exercise 3, 4 og 5 i en headerfil kaldet MessageHandling.h. Denne fil inkludere vi i vores program fra exercise 1 og 2, disse skal dog modificeres en smule.

sender. code format="cpp" // oprette objekt MsgWrapper msgs; // sender funktionen sendMsg((int)id,msgs); code receiver. code format="cpp" // opretter objekt MsgWrapper msgr; // modtager funktion receiveMsg((int) id, msgr); code

Programmet bliver enklere at tilpasse til hvilken type data man vil sende mellem de to funktioner.