#include "common.h"
|
#include "svshm.h"
|
#include "squeue.h"
|
|
using namespace std;
|
|
void sigint_handler(int sig) {
|
mm_deinit();
|
exit(0);
|
|
}
|
int main(int argc, char *argv[])
|
{
|
int semid;
|
|
void *shmp;
|
signal(SIGINT, sigint_handler);
|
/* Get IDs for semaphore set and shared memory created by writer */
|
|
semid = semget(SEM_KEY, 0, 0);
|
if (semid == -1)
|
err_exit(errno, "semget");
|
|
/*mm_init(sizeof(deque<string, myallocator::Allocator<string> >), &shmp);*/
|
/*deque<string, myallocator::Allocator<string> > *queue = (deque<string, myallocator::Allocator<string> > *) shmp;*/
|
|
SQueue<struct Item> *queue;
|
|
int first = mm_init(sizeof(SQueue<struct Item>), &shmp);
|
|
if (first == 1)
|
queue = new(shmp) SQueue<struct Item>;
|
else
|
queue = (SQueue<struct Item> *) shmp;
|
/* Transfer blocks of data from shared memory to stdout */
|
|
while(1) {
|
if (reserveSem(semid, READ_SEM) == -1) /* Wait for our turn */
|
err_exit(errno, "reserveSem");
|
std::cout << "====queue size=" << queue->size() << ", content as following===\n";
|
for (size_t i = 0; i < queue->size(); ++i)
|
{
|
// cout <<"v ptr="<< &((*v)[i])<<",value=" << (*v)[i] << endl;
|
struct Item & item = (*queue)[i];
|
cout << item.pic << " " << item.info << endl;
|
}
|
//std::cout << queue->front() << "\n";
|
|
if (releaseSem(semid, WRITE_SEM) == -1) /* Give writer a turn */
|
err_exit(errno, "releaseSem");
|
}
|
|
/*if (shmdt(shmp) == -1)*/
|
/*err_exit(errno, "shmdt");*/
|
|
/* Give writer one more turn, so it can clean up */
|
|
if (releaseSem(semid, WRITE_SEM) == -1)
|
err_exit(errno, "releaseSem");
|
|
mm_deinit();
|
exit(EXIT_SUCCESS);
|
}
|