/** * C++ class to encapsulate Unix shared memory intrinsic structures and system calls * Author: Operating systems (Francisco Arroyo) * Version: 2023/Mar/15 * * Ref.: https://en.wikipedia.org/wiki/Shared_memory * **/ #include #include #include #include #include #include "MailBox.h" #define KEY 0xA12345 /** * Class constructor * * Must call "msgget" to create a mailbox * * MailBoxkey is your student id number: 0xA12345 (to represent as hexadecimal value) * size = 1 * MailBoxflg: IPC_CREAT | 0600 * **/ MailBox::MailBox() { int st; st = msgget( KEY, IPC_CREAT | 0600 ); if ( -1 == st ) { perror( "MailBox::MailBox" ); exit( 1 ); } this->id = st; } /** * Class destructor * * Must call msgctl * **/ MailBox::~MailBox() { int st = -1; // call msgctl to destroy this message queue // check for errors return st; } struct msgbuf { long type; // this field must exist at first place char data[ MAXDATA ]; // char array for simplicity // user can define other fields }; /** * Send method * * Need to call msgsnd to receive a pointer to shared memory area * * other fields must come as parameters, or build a specialized struct * **/ int MailBox::send( long type, void * buffer, int numBytes ) { int st = -1; // must declare a msgbuf variable and set all the fields struct msgbuf m; m.type = type; memcpy( (void * ) m.data, buffer, numBytes ); // set other fields if necessary // use msgsnd system call to send message to a queue return st; } /** * receive method * * Need to call msgrecv to receive messages from queue * * Remember rules to receive message, see documentation * **/ int MailBox::receive( long type, void * buffer, int capacity ) { int st = -1; // must declare a msgbuf variable struct msgbuf m; // use msgrcv system call to receive a message from the queue // copy data from m to parameter variables return st; }